4

特定の JQuery セレクターが Jasmine で実行されたことをテストするにはどうすればよいですか? 私は次のことをしようとしています:

spyOn($.fn, 'init').andCallThrough(); 
// my code
expect($.init).toHaveBeenCalled();

しかし、この呼び出しの後、 を$('div')返しますが、返さObject { selector="div", context=document, NaN=div.spec, more...}なければなりません (実際に返します$.fn.init('div')): [div.jasmine_reporter, div.banner, div.logo, 4 more...]. JQuery オブジェクトが使用できなくなるため、このようなことは当然コードを壊します。

例:

JQuery セレクターが呼び出されたことをテストしたい場合、次のように記述します。

    it('tests', function() {
        spyOn($.fn, 'init').andCallThrough();
        $('html');
        expect($.init).toHaveBeenCalled();
    });

これにより、Jasmine: からのエラーが発生しますError: Expected a spy, but got undefined.。次に、FireBug の $('html') 行にブレークポイントを設定し、そこに着いて見ようとすると、値は次の$('html')ようになります。

Object { selector="html", context=document, NaN=html, more...}

をコメントアウトするspyOnと、その行は次の$('html')ように評価されます。

[html]

これは、私も見たいと思っていたものspyOnです。

4

1 に答える 1

3

ジャスミンは、スパイされたオブジェクトをラップされたバージョンに置き換えることでスパイのように見えます。これは、jQuery全体を台無しにしているようです(jQueryソースコードから):

// jQuery オブジェクトは、実際には「強化された」init コンストラクターにすぎません

init が使用する機能の1つ、特に「マージ」をスパイしようとすることをお勧めします。jQuery コードを見ると、HTML=>DOM が最終的にマージ呼び出しによって返されることがわかります。

return jQuery.merge( this, selector );

(たまたま jQuery 1.5.1 のソースを見ている場合、それは 152 行目です)。

マージをスパイすることで、誤って jQuery の中身を置き換えることなく、テストしているものをすべてテストできるはずです。

于 2011-10-13T17:52:03.960 に答える