Ern*_*sto 4 testing integration-testing end-to-end cypress
最初的问题并非直接与赛普拉斯缺乏对fetch api的支持有关,但这是我最初在此处发布问题的原因。我已经编辑了问题的标题,并在此处添加了此序言。本段下面是问题的原始内容:
赛普拉斯文档中包含许多示例,您可以在其中为特定的Web请求设置别名,然后可以指示赛普拉斯等待它。例如,这一个:
cy.route('POST', '/login').as('postLogin')
cy.get('input[name=username]').type('jane.lae')
cy.get('input[name=password]').type('password123{enter}')
// we should always explicitly wait for
// the response for this POST to come back
// so our tests are not potentially flaky or brittle
cy.wait('@postLogin')
Run Code Online (Sandbox Code Playgroud)
问题是我正在尝试在我的应用程序的测试中使用这种确切的技术,但我需要等待的请求不是针对托管该应用程序的同一服务器发出的。因此,我假设我可以输入后端端点的完整URL,因此cy.route不会在前面加上baseUrl,它是托管前端应用程序的主机。
// The following URL points to a backend rails app
// The frontend app I'm testing with cypress is at http://localhost:8080
cy.route('POST', 'http:/localhost:3000/session').as('postLogin')
// ... fill login form
cy.wait('@postLogin')
// The test never reaches this point
Run Code Online (Sandbox Code Playgroud)
但是,当我运行测试时,由于cypress从未意识到该请求已执行,因此我得到了超时,它将继续等待直到超时。结果是,当我检查运行cypress的浏览器中左侧栏中的测试脚本时,该路由具有我设置的显式主机,不仅是路径,而且测试还在等待此请求的发生,并说永远不会发生。当我检查浏览器开发工具的“网络”选项卡时,可以看到请求发生了。而且我可以在运行后端应用程序的终端中看到它确实被登录请求击中。此外,我在cypress的浏览器会话中运行的前端应用程序中看到该用户成功登录,并且在请求后该应用程序被重定向到了预期的页面。
问题是:我可以使赛普拉斯了解跨域请求,以便它可以等待它们吗?如果是这样,怎么办?
存根路由也不会被柏树捕获,我无法等待它们,也无法阻止它们发生,这是存根请求所期望的。
事实证明,这与跨源请求有关。我开始通过使应用程序假定后端在其相同的域中来实现这一点,并编写测试而不在模拟路由中指定主机。我有同样的行为。然后,我意识到赛普拉斯应该在浏览器左侧栏上正在运行的测试脚本中显示任何XHR请求。即使请求正在发生,它也没有显示为“ XHR”或“ XHR STUB”。因此,我意识到我不是在使用浏览器的XHR界面发出Ajax请求,而是获取了。经过一番搜索,我发现这是赛普拉斯的问题,它假定所有ajax请求都是通过XHR完成的。我在赛普拉斯的github仓库中发现了一个与此有关的问题,
以下是我最终使用的变通办法,在上述问题中的评论:
// Add this to cypress/support/commands.js
Cypress.on("window:before:load", win => {
win.fetch = null;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2771 次 |
| 最近记录: |