web-dev-qa-db-ja.com

Jasmine.jsテスト-window.openのスパイ

[〜#〜] 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を確認するための仕様を作成するにはどうすればよいですか?スペックを実行しようとすると、新しいウィンドウが開きます。

6
baconck

したがって、_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は何もしないダミー/モック関数に置き換えられます。

16
jlogan

上記のjasmine(3.5)の新しいバージョンでは、ソリューションが機能していません。テストケースの実行中に開いている新しいウィンドウを修正するための回避策がいくつか見つかりました。 window.open(url,_blank);を呼び出す前に、以下のコード行を追加してください

 window.open = function () { return window; }
0
Ravi