12

単一の引数として配列を使用してコールバック関数を呼び出すコードがあります。コールバックを呼び出した後、コードは配列の内容を変更します。次のコードに似ています。

function myCode( callback ) {
    var someArray = [ 1, 2, 3, 4 ];
    callback( someArray );

    // change someArray in arbitrary ways
    someArray.splice( 2 );
    ...
}

ここで、コールバックが正しい配列コンテンツで呼び出されていることを確認したいと思います。Jasmine.js を使用して、次のように仕様を記述します。

describe( "My code", function() {
    var callback;

    beforeEach( function() {
        callback = jasmine.createSpy( "My callback" );
        myCode( callback );
    });

    it( "calls the callback and passes the correct array", function() {
        expect( callback ).toHaveBeenCalledWith( [ 1, 2, 3, 4 ] );
    });
});

これは失敗します。問題は、Jasmine.js が配列を記録するが、そのコピーを作成しないことです。配列は呼び出し後に変更されるため、実際の呼び出しが期待どおりであったとしても、expect() 行は失敗します。可変オブジェクトでも同じ問題が発生します。

そのようなコードをテストするにはどうすればよいですか?

4

2 に答える 2

0

単体テストを正しく行うのが難しい場合は、コードをより単体的にする必要があることを示している場合があり、責任が多すぎるメソッドが存在する可能性があります。myCodeいくつかの異なることを行っているように見えます:callbackいくつかの配列に適用してから、その配列を変更します。おそらく、配列を変更するコードは、呼び出す独自のメソッドに抽出できmyCodeます。次に、コールバックが正しい引数で呼び出されていることを確認する単体テストで、その余分なメソッドを簡単にスタブ化できます。

于 2012-10-19T03:47:17.540 に答える