web-dev-qa-db-ja.com

Cypress.io-URLへのXHRリクエストをアサートしませんか?

Cypress.ioでテストする場合、特定のURLに対してXHRリクエストが行われなかったことを表明する良い方法はありますか?

「保存」ボタンがクリックされたときに新しいfooが追加されることを表明したいのですが、「キャンセル」ボタンがクリックされたときは追加されません。

このようなもの:

cy.route('POST', '/foos').as('postFoo');
cy.get('.cancel-button').click();
cy.route('@postFoo').should('not.have.been.called'); // (magic imaginary syntax!)

Assert.failを実行するonRequestコールバックを使用してcy.routeを設定しようとしましたが、URLが呼び出されたときにテストに失敗しません。

今のところ、次のような(意図的な)「リクエストは発生していません」というエラーをキャッチしています。

cy.on('fail', (err, runnable) => {
  expect(err.message).to.include('No request ever occurred.');
  return false;
});  

cy.wait('@postFoo', { timeout: 0 }).then(xhr => {
  throw new Error('Unexpected API call.');
});

...これは機能しているように見えますが、確かにあまり「ヒノキっぽい」とは感じません。

16
Brian Schroer

routeのエイリアスを変更し、そのonRequestの動作を変更してスローすることができます。 ただし一般的に決定論的ではないため、事態が発生しなかったと主張するのはより悪いことです。 次に進む前に、エラーをどのくらい待つ必要がありますか?

cy.route({
  method: 'POST',
  url: '/foos',
  onRequest: () => {
    throw new Error('Whoops')
  }
})
cy.get('.cancel-button').click();
cy.wait(1000)  // give it one second to throw, then move on

このようなアサーションがあると、テストに不要な時間が追加されるだけです。このタイプのテストは、 サイプレスドキュメントに記載されている条件付きテスト として知られています。

6
bkucera