如何解决警告“ Cypress检测到您在测试中返回了承诺”

时间:2019-07-27 02:32:22

标签: cypress

我正在cypress中编写一个测试,检查是否有新项目添加到列表中。我不想对长度进行硬编码,我想确认列表的大小增加了一个。这段代码有效:

  beforeEach(() => {
    cy.visit('/page/1');
  });

  it('happy path comments', async function() {
    cy.get('[data-cy=commentList]').should('have.length', 1);
    const list = await cy.get('[data-cy=commentList] [data-cy=comment]');
    const beforeLength = list.length;
    cy.get('[data-cy=commentBody]').type('foobar');
    cy.get('[data-cy=submit]').click();
    cy.get('.[data-cy=commentList] [data-cy=comment]').should(
      'have.length',
      beforeLength + 1
    );
    cy.get('[data-cy=commentBody]').should('have.value', '');
  });

但是,这会产生以下警告:

  

cypress_runner.js:84852赛普拉斯警告:赛普拉斯检测到您   在测试中返回了Promise,但还调用了一个或多个cy命令   兑现了诺言。

     

测试标题为:

     
    

评论快乐路径评论

  
     

尽管这在实践中可行,但通常表明   反模式。您几乎永远都不需要同时兑现承诺和承诺   调用cy命令。

如何解决此警告?

2 个答案:

答案 0 :(得分:1)

从测试中删除async/await。赛普拉斯的命令不是承诺,尽管其行为类似于承诺。阅读更多here

此外,您不能分配或使用任何赛普拉斯命令的返回值。命令已排队并异步运行。命令真正返回的是可链接的,换句话说,它是一种队列对象,它以所需的值解析。了解更多here

答案 1 :(得分:-1)

您可以将 Promise 与 await 关键字一起使用。并在 w3schools 上查找更多信息:https://www.w3schools.com/js/js_promise.asp

  • 这对我很有帮助
// {bidderCreationRequest} was declared earlier

function createBidderObject() {
  const bidderJson = {};
  await new Promise((generateBidderObject) => {
    cy.request(bidderCreationRequest).then(async (bidderCreationResp) => {
      bidderJson.id = bidderDMCreationResp.body.id;

      generateBidderObject(bidderJson);
    });
  });

  return bidderJson.id
}

createBidderObject(); // returns the id of the recently created bidder instead of undefined/null