Jasmine.js测试 - 监听window.open

15

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?当我尝试运行规范时,它会打开新窗口。

2个回答

30

所以,window.open是浏览器提供的一个方法。我不认为它会重置自身的值。因此,代码如下:

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将被替换为一个什么也不做的虚拟/模拟函数。


我已经在'beforeEach'中添加了 - chai.spy.on(window, 'open')。但仍然出现错误“未实现:window.open”。你能否提供解决方案? - Mangesh Daundkar
看起来你正在使用的浏览器没有定义 window.open。你可以尝试 var mySpy = jasmine.createSpy('name'); 然后 window.open = mySpy - jlogan
如果我使用这个,会出现错误,如下所示: “预期的spy on open应该是'link'”。 - Suryaprakash

4
在新版本的jasmine(3.5)中,上述解决方案无法正常工作。我找到了一些解决方法来修复在运行测试用例时打开新窗口的问题。在调用window.open(url,_blank);之前添加以下代码行即可。
 window.open = function () { return window; }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接