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

service_method が arg1 と arg2 で呼び出されると、スタブが特定の応答で f コールバックを呼び出し、other1 と other2 で呼び出されると、別の特定の応答で同じコールバックを呼び出すように指定したいと思います。

別のフレームワークも検討します。(Nodeunit を試してみましたが、思いどおりに動作しませんでした。)

4

3 に答える 3

13

callFakeスパイ戦略を使用できるはずです。jasmine 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']]);
  });
});

WheremethodUnderTestは結果の配列を返します。

于 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 に答える