Как заглушить contentwindow.print с помощью Cypress / test printJS с Cypress - PullRequest
0 голосов
/ 27 ноября 2018

Моя программа использует printJS - библиотеку, которая помогает форматировать содержимое страницы для печати.Я хотел написать тесты на кипарисе, чтобы проверить, был ли вызван предварительный просмотр.В настоящее время у меня есть кнопка, которая вызывает printJS при нажатии, и поскольку cypress не может взаимодействовать с окном предварительного просмотра печати, я подумал, что было бы неплохо заблокировать вызов printJS, а затем написать утверждение, что он был вызван один раз.Я понимаю, что это работает с window.print (), так как вы можете заглушить это с помощью этого кода.

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, который можно найти здесь .Я попытался заглушить окно контента, но пока что это не работает.В коде для printJS печать происходит здесь

frameElement.contentWindow.print()

с их страницы github , строка 63

Способ, которым я его ошарашиваю, дает эту проблему

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 из их index.js файла .Но я не знаю, как дальше отлаживать эту проблему.Любая помощь будет оценена.Спасибо!

1 Ответ

0 голосов
/ 09 декабря 2018

Проблема заключается в том, что хук onBeforeLoad вызывается до инициализации printJS. Когда импортируется printJS, он вызывает функцию init() и перезаписывает вашу заглушку в window.print.

Это заглушкаслишком рано

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

Заглушка после загрузки компонента и запуска printJS

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
  })
})
...