我尝试在每次测试前用Cypress进行编程登录。我的令牌保存在localStorage中。如果我同步更改它,即简单地执行localStorage.setItem
而不涉及cy.request
,它工作正常。但是,我希望使用我的认证服务器(下面的http://localhost:3004/login
)来生成令牌。
从服务器正确获取了令牌,但当我将下面的命令与cy.visit('/')
一起使用时,我得到"访问localhost:8080失败-我们尝试对此URL发出http请求,但请求失败,没有响应"(请参阅下面的完整日志)。
据我所知,这是使用auth服务器进行无头身份验证时的正确方法,我错过了什么?
- 命令. 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')
})
})
Cypress错误:cy. visit()尝试加载失败:
http://localhost:8080/
我们尝试对此URL发出http请求,但请求失败,没有响应。
我们在网络级别收到此错误:
错误:连接ECONNREFUSED::1:8080
失败的常见情况:- 您无法访问互联网-您忘记运行/启动Web服务器-您的Web服务器无法访问-您的计算机上的网络配置设置很奇怪
此错误的堆栈跟踪为:
错误:连接后在TCP连接包裹处连接ECONREFUSED::1:8080 [作为完成时](网络js:1056:14)
2条答案
按热度按时间at0kjp5o1#
好吧,这里有几个错误。
1.将
cy.route()
替换为cy.intercept()
,因为早期版本最近已弃用,请替换为新版本。1.检查使用
cy.intercept()
的语法是否正确,因为它与cy.route()
稍有不同1.我假设您正在尝试绕过某种身份验证。如果您的应用认为用户“已验证”所需的全部条件是将这些信息保存在本地存储中,您甚至不需要执行POST请求,但是,如果您这样做了,那么:
1.检查
cy.intercept()
在处理(和存根)与XHR请求相关的请求和响应对象时的用法。1.要在Cypress窗口上设置本地存储,需要使用
cy.window()
命令。jecbmhm32#
有几件事。我从来没有用过
cypress
,但是任何网络调用都是异步的。上面的函数没有一个返回从函数生成的承诺。所以在创建login
命令的地方。你需要从那个函数返回承诺,并且你需要在beforeEach
函数中等待它。可能是你的问题的原因,也可能不是。您的应用程序中是否可能存在错误,导致超时,因为您对端口
8080
上运行的服务有未经身份验证的请求。从代码的现状来看,您将在beforeEach
完成之前调用visit
(您的测试)。很可能在您进行测试时,数据不在本地存储中。快速浏览一下
cypress
的文档,看起来cypress
试图找出你的服务在哪里。另一件事看起来像是它把request
中定义的url附加到配置的baseUrl。你真的看到auth请求进入你的auth服务了吗?