javascript 带有cy.request的Cypress login命令导致后续cy.visit失败

3lxsmp7m  于 2023-01-29  发布在  Java
关注(0)|答案(2)|浏览(162)

我尝试在每次测试前用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)

at0kjp5o

at0kjp5o1#

好吧,这里有几个错误。
1.将cy.route()替换为cy.intercept(),因为早期版本最近已弃用,请替换为新版本。
1.检查使用cy.intercept()的语法是否正确,因为它与cy.route()稍有不同
1.我假设您正在尝试绕过某种身份验证。如果您的应用认为用户“已验证”所需的全部条件是将这些信息保存在本地存储中,您甚至不需要执行POST请求,但是,如果您这样做了,那么:
1.检查cy.intercept()在处理(和存根)与XHR请求相关的请求和响应对象时的用法。
1.要在Cypress窗口上设置本地存储,需要使用cy.window()命令。

jecbmhm3

jecbmhm32#

有几件事。我从来没有用过cypress,但是任何网络调用都是异步的。上面的函数没有一个返回从函数生成的承诺。所以在创建login命令的地方。你需要从那个函数返回承诺,并且你需要在beforeEach函数中等待它。可能是你的问题的原因,也可能不是。
您的应用程序中是否可能存在错误,导致超时,因为您对端口8080上运行的服务有未经身份验证的请求。从代码的现状来看,您将在beforeEach完成之前调用visit(您的测试)。很可能在您进行测试时,数据不在本地存储中。
快速浏览一下cypress的文档,看起来cypress试图找出你的服务在哪里。另一件事看起来像是它把request中定义的url附加到配置的baseUrl。你真的看到auth请求进入你的auth服务了吗?

相关问题