Cypress 会话行为的说明

Dr *_*man 1 cypress

我很困惑赛普拉斯如何将测试会话清除为空白页,和/或如何testIsolation:false工作。Cypress 允许可重用​​的测试命令和会话,如下所示:

Cypress.Commands.add('signin', (email, password) => {
  cy.session([email, password], () => {
    cy.visit('/'); // ???

    cy.get('[data-test=signin-input-email]').type(email);
    cy.get('[data-test=signin-input-password]').type(password);
    cy.get('[data-test=signin-submit]').click();

    // Assert successful login
    cy.get('[data-test=auth-card').contains(email);
  });
});
Run Code Online (Sandbox Code Playgroud)

在测试中使用这样的命令/会话时,会出现一些意外的行为。例如,下面的测试会出错,因为“导航到 about:blank 已清除页面”;但为什么当它被编程时会这样做呢cy.visit('/')?

describe('signin', () => {
  it('submits signin form with valid data', () => {
    cy.signin('valid.email@example.com', 'validpassword123');
    // Assert successful login
    cy.get('[data-test=auth-card').contains('Valid Email');
  });

  it('signs out', () => {
    cy.signin('valid.email@example.com', 'validpassword123');
    cy.get('[data-test=auth-menu]').click();
    cy.contains('Sign out').click();
    cy.get('[data-test=signin-input-email]').should('exist');
  });
});
Run Code Online (Sandbox Code Playgroud)

此外,如果我修改测试以使用该{ testIsolation: false }选项,第二个测试将失败,因为未执行登录。我怎样才能更好地编写这些命令或测试以获得预期的行为?

Jac*_*unn 5

问题是只运行一次cy.session()设置回调(即包含 的代码块)。cy.visit()

在第二次调用时,它只是将令牌从缓存恢复到 cookie(或本地存储或会话数据)。

因此,在测试隔离开启的情况下

  • 第一次测试

    1. 来电cy.session()
    2. 调用会话设置函数
    3. 哪个调用cy.visit()
    4. 导航到任何cy.get('[data-test=signin-submit]').click()重定向的地方
  • 第二次测试

    1. 导航到about/blank以清除整个页面
    2. 来电cy.session()
    3. 会话恢复缓存的凭据
    4. session不调用会话建立函数
    5. 不导航到任何地方

所以 - 在第二、第三、第四次测试中,您应该在调用后导航cy.session()


在哪里调用 cy.visit()部分对此进行了解释 -

const login = (name) => {
  cy.session(name, () => {
    cy.visit('/login')
    cy.get('[data-test=name]').type(name)
    cy.get('[data-test=password]').type('s3cr3t')
    cy.get('#submit').click()
    cy.url().should('contain', '/home')
  })
  // no visit here
}

describe('home page tests', () => {
  beforeEach(() => {
    login('user')
    cy.visit('/home')      // navigating from "about/blank" to "/home"
  })
Run Code Online (Sandbox Code Playgroud)