単一の引数として配列を使用してコールバック関数を呼び出すコードがあります。コールバックを呼び出した後、コードは配列の内容を変更します。次のコードに似ています。
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() 行は失敗します。可変オブジェクトでも同じ問題が発生します。
そのようなコードをテストするにはどうすればよいですか?