2016-11-14 1 views
2

우리가하는 게요! 플러그인의 내부에서는 setInterval을 사용과 같이되어 말할 수 있습니다 :이 서버에 대한 우리의 테스트에서서버 테스트에서 setInterval을 처리하는 방법

// index.js 

internals = { 
    storage: {}, 
    problemFunc:() => { 
    setInterval((storage) => { 
     storage.forEach((problem) => { 
     problem.foo = 'bar'; 
     }); 
    }, 500); 
    } 
}; 

module.exports.register = (server, options, next) => { 
    server.on('start',() => { // called when the server starts 
    internals.storage.problem1 = {}; 
    internals.storage.problem2 = {}; 
    internals.storage.problem3 = {}; 
    internals.problemFunc(internals.storage); 
    }); 
} 

, 우리는 시작하고 서버를 여러 번 중지 할 수 있습니다 서버의 여러 측면을 테스트합니다. 경우에 따라 cannot set property 'foo' of undefined과 같은 오류가 표시됩니다. 이는 비동기 코드가 실행되기 바로 전에 서버가 종료되고 내부적으로 서버 중지와 함께 internals.storage.problem이 제거되기 때문입니다.

이것은 총체적으로 의미가 있으며 나는 그것에 문제가 없습니다. 나는 정말로 내 테스트가 90 %가 아닌 100 %의 시간 동안 작동하는지 확인하는 좋은 방법이 무엇인지 알고 싶다.

problemFunc:() => { 
    setInterval((storage) => { 
    storage.forEach((problem) => { 
     if (problem !== undefined) { // check if deleted 
     problem.foo = 'bar'; 
     } 
    }); 
    }, 500); 
} 

또는 :

우리는 할 수

problemFunc:() => { 
    setInterval((storage = {}) => { // default assignment 
    storage.forEach((problem) => { 
     problem.foo = 'bar'; 
    }); 
    }, 500); 
} 

하지만 차라리 그냥 내 테스트를 통과하도록 내 코드에 조건문을 추가 할 것입니다. 또한, 때때로 조건부가 실행되고 때로는 실행되지 않기 때문에 코드 적용 범위를 100 % 유지하는 데 문제가 발생할 수 있습니다. 이것에 대해 더 좋은 방법은 무엇입니까?

+0

100 %의 코드 커버리지에 도달하기 위해 노력 너무 90 좋아해. – DanFromGermany

+0

@DanFromGermany 100 %를 목표로하는 것과 단일 테스트를받는 것의 차이점은 외부 요인으로 인해 실행될 때마다 제공되는 서비스 범위가 다양하다는 것입니다. –

+0

@James Thorpe : 정확합니다. 우리는 분명히 조건부를 주석 처리하여 커버리지 검사기가 그것을 무시할 수는 있지만, 나는 작동하는 어떤 것보다 이것을하기위한 명확한 방법을 찾고있다. –

답변

0

테스트 환경에서 코드를 실행할 때 설치 및 구성에 약간의 차이가있는 것은 절대적으로 정상입니다.

간단한 접근 방식은 응용 프로그램에 현재 환경을 알리는 것이므로 적절한 구성을 얻고 올바르게 서비스를 설정할 수 있습니다. 일반적인 환경은 testing, development, stagingproduction입니다.

간단한 예를 들어, 환경 변수 사용 : ENV 변수를 전달하는 테스트를 실행하거나 테스트 러너에게 그런

// env.js 
module.exports.getName = function() { 
    return process.env['ENV'] || 'development' 
} 

// main.js 
if (env.getName() !== 'testing') { 
    scheduleBackgroundTasks() 
} 

하면 할 일 :

ENV=testing npm test 
+0

답장을 고맙게 생각하지만 환경 변수를 사용하면 실제로 답을 얻지 못한다고 생각합니다. 이 예에서 플러그인은 플러그인의 환경이 무엇이든 상관없이 동일하게 작동해야하며 의도대로 작동합니다. 조건부에 환경 변수를 추가하면 처음 제시 한 솔루션에 복잡성이 추가되는 것 같습니다. –

+0

나는 동의하지 않는다. 테스트 환경에서 실행하고 싶지 않은 코드가있다. 반면에 위에서 제안한 솔루션은 합법적 인 오류를 무시하게 만듭니다. 왜냐하면 실수로 발생할 수있는 특정 변수가 초기화되었는지 여부를 묻는 것이기 때문입니다 (타이밍 오류를 추적하기는 어렵습니다). 진짜 질문은 _ 테스트입니다 _ _, _ _이 정의되지 않았습니까 _ _ _ – slezica

관련 문제