javascript - 带有 cy.request 的赛普拉斯登录命令导致后续 cy.visit 失败
问题描述
我正在尝试在每次测试之前使用赛普拉斯进行编程登录。我的令牌保存在 localStorage 中。如果我同步更改它,即简单localStorage.setItem
地不涉及cy.request
它就可以正常工作。但是,我想使用我的身份验证服务器(http://localhost:3004/login
如下)来生成令牌。
令牌是从服务器正确获取的,但是一旦我使用下面的命令以及cy.visit('/')
我得到“无法访问 localhost:8080 - 我们试图向这个 URL 发出 http 请求,但请求失败而没有响应”(见完整的日志如下)。
据我所知,这是使用身份验证服务器进行无头身份验证时的正确方法。我错过了什么?
命令.js
Cypress.Commands.add('login', () => {
cy.request({
method: 'POST',
url: `http://localhost:3004/login`,
body: {
username: 'foo@bar.com',
password: '123'
}
}).its('body').then((body) => {
const vuexData = { user: { authenticationData: { token: body.token } } }
window.localStorage.setItem('vuex', JSON.stringify(vuexData))
})
})
测试.js
describe('A test', () => {
beforeEach(() => {
cy.login()
})
it('works', () => {
cy.visit('/')
cy.get('h1').contains('All Books')
})
})
CypressError:cy.visit() 尝试加载失败:
我们尝试向此 URL 发出 http 请求,但请求失败且没有响应。
我们在网络级别收到此错误:
错误:连接 ECONNREFUSED ::1:8080
失败的常见情况: - 您无法访问互联网 - 您忘记运行/启动您的 Web 服务器 - 您的 Web 服务器无法访问 - 您的计算机上有奇怪的网络配置设置
此错误的堆栈跟踪是:
错误:在 TCPConnectWrap.afterConnect [as oncomplete] 处连接 ECONNREFUSED ::1:8080 (net.js:1056:14)
解决方案
好的,这里有几个错误。
- 替换
cy.route()
为cy.intercept()
,因为较早的版本最近已被弃用并替换为较晚的版本。 - 检查使用的正确语法,
cy.intercept()
因为它与cy.route()
- 我假设您正在尝试绕过某种身份验证。如果您的应用程序需要考虑用户“经过身份验证”是在本地存储上拥有这些信息,那么您甚至不需要执行 POST 请求,但是,如果您这样做,那么:
- 检查
cy.intercept()
用于处理(和存根)与您的 XHR 请求相关的请求和响应对象的用法。 - 要在 Cypress 窗口上设置本地存储,您需要使用该
cy.window()
命令。
推荐阅读
- java - Extract sub-string from string using regex
- sql - 从列中存储的 JSON 返回表对象
- ruby-on-rails - Rails - ArgumentError wrong number of arguments given 3, expected 2
- algorithm - 以编程方式获得具有 3 个变量和给定条件的最高结果公式
- c# - 使用 C# 在 Azure 上创建新数据库
- r - Is it it possible to accelerate the training of the Bayesian structural time series model (BSTS) by splitting the workload on multiple cpu cores?
- unity3d - 测试 Unity 在远程构建?
- python - 如何使用python读取文本文件并以html格式输出
- python - 选择了未定义的列 - 在 R 中尝试将两个数据帧相乘
- amazon-web-services - S3 通知创建多个事件