2011-12-06 2 views
2

unit.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が特定の引数を持つコールバックを実行することを保証するもう1つのテストは、すべて独立してテストする必要があります。

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

ここで、内部メソッドfをテストしたいと思っています。しかし、なぜあなたはservice_method()を模倣したいのですか?ここにあなたのモジュールの一部ではありません。もしそうなら、それを嘲笑しないでください。 –

+0

いいえ、Andreas - もちろん、methodUnderTest()をテストしたいと思います。これはservice_method()に依存します。これは、値を返す代わりにコールバックを呼び出します。 service_method()は私がスタブしたいものです。それは応答とともにf()に返されます。私は自分のモックservice_method()をコールバックしたい。 私はSinon.JSを使用してservice_method()をスタブし、スタブされた "return"値でコールバックを呼び出しました。 – Ladlestein

9

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

:ジャスミン2.0ではこれは次のようになります。

関連する問題