重定向至不同来源(跨来源)的Cypress测试
我的Web应用程序在加载时,会根据用户参数通过window.location.replace
方法自动将用户重定向到不同来源上的URL。
当Cypress测试我的应用程序并尝试遵循重定向时,它检测到违反same-origin
安全策略,测试崩溃。但我仍然需要测试window.location.replace
是否被正确调用。
根据Cypress的文档,我认为我需要使用cy.stub()
来模拟该函数,以避免浏览器实际重定向到不同来源的副作用。
我尝试了几种不同的存根方法window.location.replace
,但似乎没有一种方法能像我预期的那样工作。
// none of these work
cy.stub(window.location, "replace")
// TypeError: Cannot redefine property: replace
cy.stub(window, "location.replace")
// TypeError: Cannot stub non-existent own property location.replace
window.location.replace = cy.stub()
// TypeError: Cannot assign to read only property 'replace' of object '[object Location]'
cy.visit("http://localhost:3000");
expect(window.location.replace).to.be.called;
expect(window.location.replace).to.be.calledWith('https://some-other-origin.com/some/url')
我认为我不想使用cy.location()
,因为在发生重定向时,测试已经由于same-origin
安全违规而崩溃。
解决方案
查看Deal with window.location.replace。方法是在加载页面之前重命名源代码中的window.location
。
it('replaces', () => {
cy.on('window:before:load', (win) => {
win.__location = { // set up the stub
replace: cy.stub().as('replace')
}
})
cy.intercept('GET', 'index.html', (req) => { // catch the page as it loads
req.continue(res => {
res.body = res.body.replaceAll(
'window.location.replace', 'window.__location.replace')
})
}).as('index')
cy.visit('index.html')
cy.wait('@index')
cy.contains('h1', 'First page')
cy.get('@replace').should('have.been.calledOnceWith', 'https://www.cypress.io')
})
相关文章