cypress 会话重定向到空白页面

问题描述 投票:0回答:4

我是 cypress 的新手,可能缺少一些关于 cypress 中会话如何工作的关键理解。

我正在构建一个简单的测试,它将登录系统,然后执行特定操作 贝娄是我的测试。登录功能按预期执行,但是当第一个

it
完成时,序列将转到空白页面,除非我在下一个
it
中再次登录,否则它将不起作用。 如何在不同的
it
之间保持会话而不让它跳转页面?

describe('create cycle', () =>{

    it("login as super user", () =>{
    cy.session('login', ()=>{
            cy.visit('/')
            login();
        })  
    })

    it('start cycle', ()=>{  
      cy.get("#cycles-library > ul > #library-item-2").click();
      cy.get("#create-cycle").click()
      cy.get("#startDate > label").first().click()
      cy.get("#duration > label").first().click()
      cy.get('#groups-input').click()
      cy.get("body>div").last().contains('group 2').click()
      cy.get("button#create-cycle").click()

    })

})

谢谢!

reactjs testing cypress
4个回答
4
投票

cy.session()
通常与
beforeEach()
一起使用,以确保为每个测试设置正确的会话数据。

图案是

describe('tests requiring session data', () =>{

  beforeEach(() =>{
    cy.session('login', ()=>{
      cy.visit('/')
      login();
    })  
  })

  it('test that expects logged-in status', () => {  

  it('another one', () => {  
})

看似您每次都在执行登录,但事实并非如此。

cy.session()
是一个缓存功能,它在第一次测试时运行一次,然后为每个后续测试恢复会话数据。

你可以把它想象成带有空依赖列表的 React hooks

useEffect()
,它在组件生命周期中也只运行一次。

既然您有一个登录测试,您应该在另一个

describe()
块中单独执行该测试,因为每个测试的初始条件都不同。


4
投票

就我而言,我必须将 testIsolation 属性设置为 false。之后 cy.session 开始工作并且不会以空白页结束:

describe('my tests',{ testIsolation: false }, () => {...});

1
投票

每个

it
都会清除导航器存储,包括您的会话。

要处理此问题,您应该创建一个 cypress 命令,它将为您创建会话,该命令可以根据您的认证而更改。

例如,如果您有一个简单的 POST

/login
端点,它接收用户名和密码参数,并且返回的会话数据必须存储在 cookie 中,您可以制作如下内容:

// cypress/support/commands.js
Cypress.Commands.add('login', () => {
  cy.request('POST', `${Cypress.env('apiUrl')}/users/login`, {
    username: Cypress.env('userEmail'),
    password: Cypress.env('userPassword'),
  }).then((response) => {
    cy.setCookie('sessionId', response.body.sessionId)
    cy.setCookie('userId', response.body.userId)
    cy.setCookie('userName', response.body.userName)
  })
})

在您的测试或

beforeEach
测试中:

...
    it('start cycle', () => {  
      cy.login()
      // cy.get("#cycles-library > ul > #library-item-2").click();
      // cy.get("#create-cycle").click()
      // cy.get("#startDate > label").first().click()
      // cy.get("#duration > label").first().click()
      // cy.get('#groups-input').click()
      // cy.get("body>div").last().contains('group 2').click()
      // cy.get("button#create-cycle").click()
    })
...

我建议您存根每个具体要求 ,拥有来自应用程序的所有请求/响应的列表,然后用它来测试您的后端。这使得事情变得更快、更容易。

Pact 使用这个策略,但你不一定需要使用 Pact,只需保持你的测试数据同步以测试后端和前端,否则即使你的 CI 通过了,事情也会在生产中崩溃,一个单一仓库可以帮忙。


0
投票

一点都不好笑。

首先我犯了一个常见的错误,没有做断言。好的,昨天一切正常。

明天,我有同样的问题,没有做出不寻常的改变。

所以花了1个小时后,我只是放在cy.login和cy.visit之间。它起作用了。

之前enter image description here

我做了之后enter image description here

工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.