1

ジャスミンを使用して JavaScript をテストしていますが、仕様が難しいケースを見つけています。ハンドラーに直接渡される次の関数があります。

filters.find('#per_page').change(checkList.filter);

今、私はそれをスパイして、それを変更したときに呼び出されているかどうかを確認したいと思います:

describe("when I change the number of items per page", function() {
   beforeEach(function() 
      spyOn(checkList, 'filter');
      $('#per_page').val('50').trigger('change'); 
   });
   it("filters the results list", function() {
     expect(checkList.filter).toHaveBeenCalled();
   });
});

このテストは失敗します。驚いたことに、上記のコードを次のように変更すると:

filters.find('#per_page').change(function() { checkList.filter(); });

それは通過します。渡されたそのような関数をスパイする方法はありますか、または匿名関数のケースに頼る必要がありますか?

4

1 に答える 1

1

はい、ありますが、そのためには、関数にスパイを追加した後にイベントをバインドする必要があります。これは、スパイがプロパティを別の関数に置き換えるためです (関数自体は変更されません)。あなたの場合、元の関数を割り当て、スパイを追加したときに、バインドされたコールバックを変更せずにプロパティを置き換えました。

アプリケーションの作成方法によっては、イベント バインディングを実行する前にスパイを追加できない場合、適切なコールバックを呼び出す匿名関数を使用することしかできません。

于 2013-10-10T14:43:11.847 に答える