在 each 之前使用 Cypress 来清理数据库数据

Using Cypress's before each to clean up DB data

我正在运行在暂存环境中针对我的应用程序设置 Cypress 测试列表。

文档说使用 before 挂钩删除数据,但是在我 运行 测试并添加它之前我不知道行的 ID,所以这不是可能。

describe('Entity Page', () => {
  before(() => {
    const { username, password } = Cypress.env();
    cy.login(username, password);
    cy.addEntity(name, email, mobile, {});

    cy.wait(3000);
    cy.get('@id').then(id => {
      cy.visit(`/entity/${id}`)
      cy.wait(6000)
    });
  });

  it('form contains new entity details', () => {
    cy.get('[data-testid=title]').should('have.text', name);
  });


  after(() => {
    cy.get('@id').then(id => {
      cy.log('removing ID ', id);
      if (id) {
        cy.deleteEntity(id);
      }
    });
  });
});

我看不出有什么方法可以在不知道生成实体的 ID 的情况下 运行 我在之前删除。但是,如果在我的 after 块中删除失败,这就会导致问题,因为其他测试没有 运行.

当您在测试开始前不知道标识符时,是否有推荐的方法来执行此类操作?

由于您的数据库的详细信息是隐藏的,因此很难具体说明,但您想要的东西可以 cy.deleteAllIds()

如果不是,则将 id 写入夹具

cy.get('@id').then(id => {
  cy.writeFile('cypress/fixtures/idToDelete.json', {id})
  ...
})

并在 before()

before(() => {
  cy.fixture('idToDelete.json').then(data => {
    if (data.id) cy.deleteEntity(data.id)
    cy.writeFile('cypress/fixtures/idToDelete.json', {})
  })
})

此外(这可能有效也可能无效)您不应该使用 after() 的原因是因为失败的测试可能会跳过 after 挂钩。

因此您可以捕获失败事件并删除那里的 ID(但保留成功路径的 after())。

cy.on('fail', () => {
  cy.get('@id').then(id => {
    cy.log('removing ID ', id);
    if (id) cy.deleteEntity(id);
  })
})