我的node.js应用程序中有一个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...
}
我想指定当使用arg1和arg2调用service_method时,存根将使用特定响应调用f回调,并且当使用other1和other2调用它时,它将使用不同的特定响应调用相同的回调
我也会考虑一个不同的框架。 (我尝试过Nodeunit,但没有按照我的意愿去做。)
答案 0 :(得分:11)
您应该能够使用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
返回结果数组。
答案 1 :(得分:0)
你不能按原样存根,因为它是方法内部的私有。
你在这里测试错误的东西。应通过确保正确处理结果来测试methodUnderTest
。确保service_method
使用特定参数执行回调是完全另一个测试,应该独立测试。
现在methodUnderTest
的规范可以简单地说明回调之后会发生什么。不要担心回调是否有效,因为你已经在其他地方进行了测试。只是担心方法对回调结果的作用。
即使service_method
来自您不直接控制的图书馆或销售代码,这仍然适用。经验法则是测试您自己编写的代码,并相信其他库遵循相同的规则。
答案 2 :(得分: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)}
});