2011-12-06 26 views
2

我在我的Node.js应用程序中有一个JS方法,我想单元测试。它会对服务方法进行多次调用,每次都会将该服务传递给一个回调函数;回调积累结果。使用Jasmine根据参数值存根JS回调

如何使用Jasmine来存储服务方法,以便每次调用存根时,都会调用由参数确定的响应的回调函数?

这是(像)的方法,我测试:

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... 
} 

我想指定,当service_method调用与ARG1和ARG2,存根将调用与特定响应的F回调,并当用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();我想验证一下,在调用其依赖关系之后(在本例中为service_method()),它会累积结果。 – Ladlestein

+0

好吧,据我所知你想在这里测试内部方法?但为什么你想嘲笑service_method()。这不是你模块的一部分吗?如果是这样,不要嘲笑它。 –

+0

不,Andreas - 当然,我想测试methodUnderTest()。它依赖于service_method(),它不是返回一个值而是调用一个回调函数。 service_method()是我想要的存根。它会回复给f()和响应;我想要我的模拟service_method()回调它。 我已经成功地使用了Sinon.JS来存根service_method(),并调用带有stubbed“return”值的回调函数。 – Ladlestein

9

您应该能够使用callFake间谍战略。在茉莉2.0,这将是这样的:

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']]); 
    }); 
}); 

methodUnderTest返回结果数组。