【问题标题】:cypress.io waiting for same aliascypress.io 等待相同的别名
【发布时间】:2020-02-23 09:49:10
【问题描述】:
cy.server();
cy.route('POST', 'my/api').as('myApi');
...
cy.wait('@myApi');
...
cy.route('POST', 'my/api').as('myApi');
cy.wait('@myApi');

当我的应用在同一个测试中两次调用同一个 API 时,从上面的代码中,第二个 cy.wait 立即完成,因为它看到第一个 API 已经完成。为了解决这个问题,我在所有路由别名后面附加了一个随机数。这是正确的方法吗?

【问题讨论】:

    标签: cypress


    【解决方案1】:

    你也许可以做得更好。 cy.route() 命令只是一个定义,因此您应该将所有路由分组在文件的顶部。路由只需要定义一次。然后尝试将您的等待链接起来,如cy.wait().otherStuff().wait() 或至少将您的等待与其他必须首先成功的东西链接起来。

    【讨论】:

    • 如果同一条路线我必须wait 两次,它会如何工作? wait 知道吗?对我来说,如果第二个 wait 与第一个别名相同,它似乎会立即返回。
    • Cypress 命令是异步的,因此它们可以立即返回而无需解析。一个命令必须在链中的其他命令运行之前解析。这就是为什么我建议链接以获得你想要的行为。赛普拉斯还管理重试,因此赛普拉斯将等到断言变为真,然后再继续执行链中的下一个命令。这是安排测试的好方法。使用持续时间调用 wait 是一种反模式。
    【解决方案2】:

    感谢您的提问!我认为前面的答案是完全正确的。默认情况下,cypress 路由只是别名。您可以在 cypress 文档 here 中找到类似的示例。

    所以,你的代码应该是这样的:

    cy.server();
    cy.route('POST', 'my/api').as('myApi');
    cy.wait('@myApi').then(() => {
        // You probably want to add some assertions here
    });
    
    // Do your stuff here
    
    cy.wait('@myApi').then(() => {
        // Second assertion. Probably, something should be changed in the second request.
    });
    

    【讨论】:

      【解决方案3】:

      在这种情况下,对于第二次等待,您可以尝试以下操作。

          cy.server();
          cy.route('POST', 'my/api').as('myApi');
          cy.wait('@myApi').then(() => {
              // You probably want to add some assertions here
          }); 
      
              // Do your stuff here
      
          cy.wait(['@myApi', '@myApi']).then(() => {
              // Second assertion. Probably, something should be changed in the second request.
          }); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        相关资源
        最近更新 更多