有没有办法断言赛普拉斯没有调用路由?

Chr*_*ier 5 javascript chai cypress

我试图断言赛普拉斯没有调用过一条路线.我仔细查看了文档并没有找到任何结果.

我想做这样的事情:

cy.get('@myRouteAlias').should('have.not.been.called');
Run Code Online (Sandbox Code Playgroud)

我目前正在解决这个问题,断言成功的请求toast消息没有显示,但它是一个脆弱的解决方案.

有任何想法吗?

gui*_*epn 14

不幸的是,以上都没有真正对我有用,我用这个命令让它工作:

Cypress.Commands.add('shouldBeCalled', (alias, timesCalled) => {
  expect(
    cy.state('requests').filter(call => call.alias === alias),
    `${alias} should have been called ${timesCalled} times`
  ).to.have.length(timesCalled);
});
Run Code Online (Sandbox Code Playgroud)

然后我像这样使用:

// Checks that FetchChatList has not been called
cy.shouldBeCalled('FetchChatList', 0);
Run Code Online (Sandbox Code Playgroud)

  • cy.state 未定义? (2认同)

Jen*_*ane 12

测试没有发生动作的情况非常困难.有了这种断言,你真的只能说:

"XHR请求并非在400ms赛普拉斯寻找此XHR请求(或者您设置超时的任何内容)内"

这并没有真正确认从未调用过XHR请求.

话虽这么说,赛普拉斯提供了一种方法来检索使用未记录的所有XHR请求cy.state('requests').您可以检查其长度,通过别名等过滤它们,以确定您想要的内容.

  • 在 Cypress 6.9.0 中,“state”方法似乎不再可用。是不是被别的东西代替了? (9认同)

Sti*_*egi 9

这些在 7.6 版本中都不适合我,但我找到了一个非常简单的解决方案。

鉴于您有这样的拦截:

cy.intercept('GET', '**/foo/bar**').as('myRequest');
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

cy.wait(2000);
cy.get('@myRequest.all').then((interceptions) => {
    expect(interceptions).to.have.length(0);
});
Run Code Online (Sandbox Code Playgroud)

因此,当请求可能发生时,您等待一段时间,并在等待后确保它没有发生。对我来说工作得很好,不需要额外的命令。我在这里找到了该解决方案:https ://www.gitmemory.com/issue/cypress-io/cypress/15036/780706160


小智 6

作为路由选项onResponse功能的变体集,它会掉线测试

例如 expect(true).to.be.false;

如果当前路线发生呼叫,它将触发错误

cy.route({
    url: <url>,
    onResponse: function () {
       expect("Unexpected Https call").to.be.false;
    }
})
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用,以一种奇怪的方式。我在测试之外放置了一个 `let putRequestMade = false` ,并在我的路由的 `onRequest` 内放置了一条日志语句和一个 `putRequestMade = true` 。我在请求之前和之后断言“putRequestMade”。当我在“cy.wait('@putRequest')”之后“expect(putRequestMade).to.eq(true)”时,断言失败,并且我可以看到日志语句没有触发。但是,当我删除“putRequestMade”断言时,我会看到日志语句,并且在调试器中我可以看到“putRequestMade = true”。添加“cy.wait”等待,但在那里断言,它立即失败! (2认同)

Bar*_*aby 5

值得考虑这个测试的异步特性,这是前面的例子没有考虑到的。这是一个工作示例:

cy.route('/my-route').as('myRoute')

const noExpectedCalls = 1

cy.get('@myRoute').then(() => {
  expect(cy.state('requests').filter(r => r.alias === 'myRoute')).to.have.length(noExpectedCalls)
})
Run Code Online (Sandbox Code Playgroud)


Sle*_*ker 5

这是使用 cypress 命令断言请求计数的正确方法。

把它放在你的commands.js文件中:

Cypress.Commands.add('requestsCount', (alias) =>
  cy
    .wrap()
    .then(() => cy.state('requests').filter(req => req.alias === alias).length),
);
Run Code Online (Sandbox Code Playgroud)

比在您的测试中使用新命令,如下所示:

it('should count requests', () => {
  cy.server();
  cy.route('**').alias('theRequest');

  cy.wait('@theRequest');
  cy.requestsCount('theRequest').should('eq', 1);
});
Run Code Online (Sandbox Code Playgroud)

  • 这种抽象可能是所有回应中最好的。 (2认同)