在 Cypress 中,我到底如何在测试文件中使用辅助函数文件的返回值?

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

我是 Cypress 的新手,已经在自己的文件中设置了一堆辅助函数。我希望其中一个函数返回一个值,但是我一直不知道如何在 Cypress 的同步结构中执行此操作。

我不断收到错误消息

CypressError:

cy.then()
失败,因为您混淆了异步和同步代码。

我尝试实现此处提到的类似修复Cypress 在异步命令中返回同步值?但无济于事。

我的代码是这样的:

辅助功能:

//helperFunction.js
module.exports.schemaChecker = () => {
    cy.get('script:contains("@context")').its('length').then((len) => {
        cy.task('log', 'Schemas: ' + len);
        if (len > 1) {
            return "fail";
        }
    })
}

测试文件:

import { schemaChecker, } from '../../support/helperFunctions.js';
// other stuff...

Given('I am on X page', () => {
    cy.viewport(1480, 1000);
    cy.visit(pageUrl);

    schemaChecker().then((response) => {
        if (response == "fail") {
           // Do something
        };
    })
});

我已经尝试了一些变体(例如:

if (schemaChecker() == "fail") {}
),但我只是不确定如何使其协同工作,并且无法在Google上找到任何有用的东西。

有人能指出我正确的方向吗?

javascript node.js cypress
1个回答
0
投票

错误您混淆了异步和同步代码指的是

cy.task()
调用(异步)和
return 'fail';
(同步)。

module.exports.schemaChecker = () => {
  return cy.get('script:contains("@context")').its('length').then((len) => {

    cy.task('log', 'Schemas: ' + len);  // <-- async

    if (len > 1) {
      return 'fail'                     // <-- sync
    }
  })
}

解决方法之一是使这两个步骤异步

module.exports.schemaChecker = () => {
  return cy.get('script:contains("@context")').its('length').then((len) => {

    cy.task('log', 'Schemas: ' + len);  // <-- async

    if (len > 1) {
      return cy.wrap('fail')            // <-- also async
    }
  })
}

enter image description here


这是我的测试

it('check the schema', () => {
  schemaChecker().then((response) => {
    if (response === 'fail') {
      Cypress.log({name: 'schema error', message: 'Woops it failed'})
    };
  })
})

以及我的应用程序页面存在故意错误情况

<body>
  <script>
    const var1 = '@context'
  </script>
  <script>
    const var2 = '@context'
  </script>
</body>
© www.soinside.com 2019 - 2024. All rights reserved.