3

我的 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,但没有让它做我想做的事。)

4

3 回答 3

13

You should be able to use the callFake spy strategy. In jasmine 2.0 this would look like:

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

Where methodUnderTest returns the results array.

于 2014-02-01T22:32:15.877 回答
0

由于我不确定您是否在这里测试了正确的东西,您可以使用间谍并调用 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)}

});
于 2011-12-06T23:18:44.307 回答
0

您不能按原样存根,因为它是该方法的内部私有。

你在这里测试错误的东西。 methodUnderTest应通过确保正确处理结果来进行测试。确保service_method使用特定参数执行它的回调完全是另一个测试,应该独立测试。

现在的规范methodUnderTest可以简单地是关于回调之后发生的事情。不要担心回调是否有效,因为您已经在其他地方进行了测试。只需担心该方法对回调结果的作用。

即使service_method来自您不直接控制的库或供应商代码,这仍然适用。经验法则是测试您自己编写的代码,并相信其他库遵循相同的规则。

于 2011-12-06T22:57:13.960 回答