在 Cypress 测试中关闭清除别名

Leo*_*nks 6 cypress

我们有许多来自 API 的变量,在整个测试过程中都会使用它们。这些值在不同点保存到别名中。

我们如何关闭测试之间清除别名的功能?

如果我们使用一个大型测试,这可以正常工作,但 Cypress 默认情况下会清除测试之间的别名,因此当我们将测试分解为更小、更易于管理的单元时,我们就破坏了代码。

简单的例子:

before(() => {
  cy.wrap(123).as('alias')
})

it('test1', () => {
  // alias is usable here
  cy.get('@alias').should('eq', 123)    
  cy.wrap(456).as('alias2')
});

it('test2', () => {
  // alias is missing here
  cy.get('@alias').should('eq', 123)    
  cy.get('@alias2').should('eq', 456)  
});
Run Code Online (Sandbox Code Playgroud)

Fod*_*ody 5

没有配置可以关闭别名清除。

\n

您必须创建一个自定义命令才能执行此操作。

\n
Cypress.Commands.add(\'keepAliases\', function(aliasList) {\n  if (!aliasList) {\n    aliasList = Object.keys(this)\n      .filter(key => ![\'test\', \'_runnable\', \'currentTest\']\n      .includes(key))\n  }\n  aliasList.forEach(key => {\n    cy.wrap(this[key]).as(key)\n  })\n})\n
Run Code Online (Sandbox Code Playgroud)\n

用于单个测试

\n
before(() => {\n  cy.wrap(123).as(\'alias\')\n})\n\nit(\'test1\', () => {\n  cy.get(\'@alias\').should(\'eq\', 123)    \n  cy.wrap(456).as(\'alias2\')\n});\n\n// \xe2\x9c\x85 test passes \nit(\'test2\', () => {\n  cy.keepAliases()\n  cy.get(\'@alias\').should(\'eq\', 123)  \n  cy.get(\'@alias2\').should(\'eq\', 456)\n});\n
Run Code Online (Sandbox Code Playgroud)\n

用于所有测试

\n
before(() => {\n  cy.wrap(123).as(\'alias\')\n})\n\nbeforeEach(() => {\n  cy.keepAliases()\n})\n\nit(\'test1\', () => {\n  cy.get(\'@alias\').should(\'eq\', 123)    \n  cy.wrap(456).as(\'alias2\')\n});\n\n// \xe2\x9c\x85 test passes \nit(\'test2\', () => {\n  cy.get(\'@alias\').should(\'eq\', 123)  \n  cy.get(\'@alias2\').should(\'eq\', 456)\n});\n
Run Code Online (Sandbox Code Playgroud)\n