2

モデルがビューのコレクションに追加されたときにビューの関数が呼び出されることを確認するために、Jasmine仕様を作成しようとしています。

ビューの初期化関数で私はします

this.collection.on('add', this.fooAdded, this);

私のジャスミン仕様では、私は次のことを行っています。

describe('Foo View', function() {
   it('should call fooAdded when a Foo is added', function() {
      var view = new FooView({collection: new FooCollection()});
      spyOn(view, 'fooAdded').andCallThrough();
      view.delegateEvents();
      view.collection.add({name: 'foo'});
      expect(view.fooAdded).toHaveBeenCalled();
   });
});

fooAdded()の実装はコンソールに何かを記録するので、呼び出されていることがわかります。ただし、スパイはfooAdded()が呼び出されたことを認識しません。

私のjsFiddleを参照してください

4

2 に答える 2

4

問題はspyOn、spied on関数を新しいラッパー関数に置き換えることですが、関数が使用されたにそれを置き換えています。spyOn(view, 'fooAdded')スパイを添付するために呼び出すときまでに、オリジナルへの参照fooAddedはすでにコレクションのリスナーリストにあるため、そのコールバックをスパイするには遅すぎます。

ビューをインスタンス化する前fooAddedに、ビューのプロトタイプをスパイする場合:

spyOn(FooView.prototype, 'fooAdded');
var view = new FooView(...);
view.delegateEvents();
//...

そうすれば物事はうまくいくはずです。デモ: http: //jsfiddle.net/m5Baw/1/ (デモのJasmineリンクを更新してくれたamiuhleに感謝します)。

余談ですが、ビューで何か奇妙なことが起こっていると思います。view.delegateEvents()ビューのコードの外に出る必要はないので、それを詳しく調べたいと思うかもしれません。

于 2012-12-27T18:42:31.330 に答える
2

私は応答しようとしていました、そして「muは短すぎます」は正確に正しいです。あなたのスパイが登録されていないことを証明する最初のことはあなたの代わりに次のコードを使用することですspyOn(view, 'fooAdded').andCallThrough();

spyOn(FooView.prototype, 'fooAdded').andCallFake(function(){
           console.log('fake "fooAdded" called');
        });

fooAddedコレクションリスナーにすでに登録されているため、これが呼び出されることはありません。これが更新されたjsFiddleです

于 2012-12-27T19:09:34.103 に答える