我的程序使用printJS,这是一个有助于格式化页面内容以进行打印的库。我想用cypress编写测试,以测试是否已调用打印预览。当前,我有一个单击按钮时会调用printJS的按钮,并且由于cypress无法与打印预览窗口交互,因此我认为将调用存入printJS然后编写一个被调用一次的断言是个好主意。我知道这可与window.print()一起使用,因为您可以使用此代码对它进行 stub 。

cy.visit('http://127.0.0.1/',{
    onBeforeLoad: (win) => {
        cy.stub(win, 'print')
    }
})

然后断言
cy.contains('print').click()
cy.window().then((win) => {
    expect(win.print).to.be.calledOnce
})

我的旧按钮
<button type="button" class="btn btn-secnodary" onclick="window.print()">
    Print
</button>

但是我改用了printJS,这意味着我的按钮现在看起来像这样
<button type="button" onclick="printJS({printable: 'id_preview_modal_body', type: 'html'})" data-dismiss="modal">
    Print
</button>

将javascript作为print.min.js加载,可以在here中找到。我试图对内容窗口进行 stub 处理,但到目前为止似乎还行不通。在printJS的代码中,打印在这里进行
frameElement.contentWindow.print()

their github page,第63行

我 stub 的方式给这个问题
cy.visit('http://127.0.0.1:8000/notices/new/',{
    onBeforeLoad: (win) => {
        cy.stub(win, 'printJS')
    }
})

Uncaught TypeError: Cannot stub non-existent own property printJS

断言也给出了这个错误
cy.window().then((win) => {
    expect(win.printJS).to.be.calledOnce
})

TypeError: [Function: init] is not a spy or a call to a spy!

我认为[Function: init]是他们const printJS = print.init file中对index.js的引用。但是我不知道如何进一步调试此问题。任何帮助,将不胜感激。谢谢!

最佳答案

问题是在启动printJS之前调用了onBeforeLoad Hook ,当导入printJS时,它将调用它的init()函数并覆盖window.print中的 stub 。

这太早了

cy.visit('http://127.0.0.1:8000/notices/new/',{
    onBeforeLoad: (win) => {
        cy.stub(win, 'printJS')
    }
})

加载组件并启动printJS后 stub
const printStub

before(function(){

  cy.visit('http://127.0.0.1:8000/notices/new/')

  // maybe wait for loading to complete

  cy.window().then(win => {
    printStub = cy.stub(win, 'printJS')
  })
})

it('stubs printJS', () => {
  cy.contains('button', 'Print').click()
  cy.window().then(win => {
    expect(printStub).to.be.calledOnce
  })
})

关于javascript - 如何使用cypress stub contentwindow.print/如何使用cypress测试printJS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53505706/

10-13 02:18