【问题标题】:Jasmine.js Testing - spy on window.openJasmine.js 测试 - 窥探 window.open
【发布时间】:2016-09-20 20:44:39
【问题描述】:

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

【问题讨论】:

    标签: javascript jasmine jasmine-jquery


    【解决方案1】:

    所以,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”。您能否为此提出解决方案?
    • 看起来你运行的任何浏览器都没有定义window.open。你可以试试var mySpy = jasmine.createSpy('name'); 然后window.open = mySpy
    • 如果我使用它,我会收到类似Expected spy on open to be 'link' 的错误
    【解决方案2】:

    在 jasmine(3.5) 的新版本中,上述解决方案不起作用。我找到了一些解决方法来修复运行测试用例时打开的新窗口。在调用您的 window.open(url,_blank); 之前添加以下代码行

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 2017-02-27
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      相关资源
      最近更新 更多