[〜#〜] js [〜#〜]
var link = this.notificationDiv.getElementsByTagName('a')[0];
link.addEventListener('click', function (evt){
evt.preventDefault();
visitDestination(next);
}, false);
}
var visitDestination = function(next){
window.open(next)
}
仕様
var next = "http://www.example.com"
it( 'should test window open event', function() {
var spyEvent = spyOnEvent('#link', 'click' ).andCallFake(visitDestination(next));;
$('#link')[0].click();
expect( 'click' ).toHaveBeenTriggeredOn( '#link' );
expect( spyEvent ).toHaveBeenTriggered();
expect(window.open).toBeDefined();
expect(window.open).toBe('http://www.example.com');
});
リンクがクリックされたときにテストし、visitDestination
を呼び出し、window.open == next
を確認するための仕様を作成するにはどうすればよいですか?スペックを実行しようとすると、新しいウィンドウが開きます。
したがって、_window.open
_はブラウザによって提供されるメソッドです。それ自体の価値がリセットされるとは思わない。したがって、この:
_expect(window.open).toBe('http://www.example.com');
_
...何があっても失敗するだろう。
必要なのは、window.openメソッドのモックを作成することです。
_spyOn(window, 'open')
_
これにより、いつ実行されたかを追跡できます。また、実際の_window.open
_関数が実行されなくなります。そのため、テストを実行しても新しいウィンドウは開きません。
次に、_window.open
_メソッドが実行されたことをテストする必要があります。
_expect(window.open).toHaveBeenCalledWith(next)
_
編集:詳細。 visitDestinationが実行されたことをテストする場合は、次のようにします。
_spyOn(window, 'visitDestination').and.callThrough()
...
expect(window.visitDestination).toHaveBeenCalled()
_
ここでは、.and.callThrough()
が非常に重要です。使用しない場合、通常のvisitDestination
は何もしないダミー/モック関数に置き換えられます。
上記のjasmine(3.5)の新しいバージョンでは、ソリューションが機能していません。テストケースの実行中に開いている新しいウィンドウを修正するための回避策がいくつか見つかりました。 window.open(url,_blank);
を呼び出す前に、以下のコード行を追加してください
window.open = function () { return window; }