2011-12-06 3 views
2

unit 테스트 할 node.js 앱에 JS 메서드가 있습니다. 그것은 서비스 메소드에 여러번 호출을하고, 매번 그 서비스에 콜백을 전달한다. 콜백은 결과를 누적합니다.Jasmine을 사용하여 인수 값을 기반으로 JS 콜백을 스텁합니다.

재 스민을 사용하여 서비스 메소드를 스텁 아웃 할 수 있으므로 스텁이 호출 될 때마다 인수로 결정된 응답으로 콜백을 호출 할 수 있습니까?

이것은 (같은) 방법 난 시험 :

내가 service_method은 ARG1과 ARG2로 호출 될 때, 스텁 특정 응답은 F 콜백을 호출하도록 지정하려면
function methodUnderTest() { 

    var result = []; 
    var f = function(response) {result.push(response)}; 

    service_method(arg1, arg2, f); 

    service_method(other1, other2, f); 

    // Do something with the results... 
} 

하고, other1 및 other2와 함께 호출 될 때 다른 특정 응답으로 동일한 콜백을 호출합니다.

다른 프레임 워크도 고려해 볼 수 있습니다. (Nodeunit을 시도했지만 원하는대로 할 수 없었습니다.)

답변

0

메소드에 내부적으로 있기 때문에 그대로 스텁 할 수 없습니다.

여기에서 잘못된 것을 테스트하고 있습니다. methodUnderTest은 테스트 결과가 올바르게 처리되도록해야합니다. service_method이 특정 인수를 사용하여 콜백을 실행하는지 확인하는 것은 또 다른 테스트이며 독립적으로 테스트해야합니다.

이제 methodUnderTest의 스펙은 콜백 이후에 어떤 일이 발생하는지 간단히 알 수 있습니다. 콜백이 작동하면 걱정하지 마십시오. 이미 다른 곳에서 테스트했기 때문입니다. 콜백의 결과로 메소드가하는 일에 대해 걱정하면됩니다.

service_method이 직접 통제하지 않는 라이브러리 또는 판매자 코드에서 가져온 경우에도 여전히 적용됩니다. 어림짐작은 자신이 작성한 코드를 테스트하고 다른 라이브러리가 동일한 규칙을 따르는 것입니다.

0

여기서 올바른 것을 테스트하고 있는지 확실하지 않으므로 spy을 사용하고 spy.argsForCall을 호출 할 수 있습니다. 테스트에

var Service = function() { 
}; 

Service.service_method = function (callback) { 
    someAsyncCall(callback); 
}; 

function methodUnderTest() { 

    var result = []; 
    var f = function(response) {result.push(response)}; 

    Service.service_method(arg1, arg2, f); 

    Service.service_method(other1, other2, f); 

} 

:

it('should test something', function() { 
    spyOn(Service, 'service_method'); 
    methodUnderTest() 
    var arg1 = Service.argsForCall[0][0]; 
    var arg2 = Service.argsForCall[0][1]; 
    var f = Service.argsForCall[0][2]; 
    if(arg1==condition1 && arg2==condition2){f(response1)} 

}); 
+0

여기 내 대답은 모두 내 질문을 잘못 해석 한 것입니다. 이유가 궁금합니다. 나는 정말로 methodUnderTest()를 테스트하고있다. 나는 그것이 dependencies (이 경우에는 service_method())를 호출 한 후에 결과를 누적시키는 지 확인하고자한다. – Ladlestein

+0

좋아, 자네가 내부 방법 f를 테스트하고 싶다고 생각하니? 하지만 왜 service_method()를 조롱하고 싶습니까? 여기에 모듈의 일부가 아닌가? 그렇다면 조롱하지 마십시오. –

+0

아니요, Andreas - 물론 methodUnderTest()를 테스트하고 싶습니다. 값을 반환하는 대신 콜백을 호출하는 service_method()에 따라 다릅니다. service_method()는 내가 스텁하고자하는 것입니다. 응답과 함께 f()를 호출합니다. 내 모의 service_method()를 다시 호출하기를 원합니다. Sinon.JS를 사용하여 service_method()를 스텁하고 stubbed "return"값으로 콜백을 호출했습니다. – Ladlestein

9

당신은 callFake 스파이 전략을 사용할 수 있어야합니다. 자스민 2.0에서는이 보일 것 같은 : methodUnderTest이 결과 배열을 반환

describe('methodUnderTest', function() { 
    it("collects results from service_method", function() { 
    window.service_method = jasmine.createSpy('service_method').and.callFake(function(argument1, argument2, callback) { 
     callback([argument1, argument2]); 
    }); 

    arg1 = 1, arg2 = 'hi', other1 = 2, other2 = 'bye'; 
    expect(methodUnderTest()).toEqual([[1, 'hi'], [2, 'bye']]); 
    }); 
}); 

.