如果有任何cy,则cypress onRequest处理程序将失败。内部使用的方法

时间:2018-11-07 15:06:23

标签: javascript automation cypress

基本上,我的任务是下一个:当我的应用触发外向xhr请求时,我想对请求有效负载进行一些声明,并在请求完成后继续执行其他声明。 因此,我在onRequest方法上使用了cy.route选项,该方法使您可以访问传出xhr请求。我的初始代码如下:

cy.server();
cy.route({
  method:'POST',
  url:'/api/v3/table-metas/**',
  onRequest(xhr) {
    console.log('==========BEFORE========');
    cy.wrap(xhr).
    its('request').
    its('body').
    its('embedded').
    should('to.deep.equal',
      [
        {
          "attributes": {
            "name": "Test Name"
          },
          "type": "test_type"
        }
      ]
    ).debug();
    console.log('=============AFTER===========');
 }
}).as('getTableMetas');

但是此代码使我的应用程序认为该请求失败,并且在cypress日志中,它向我显示该请求正在等待处理,直到超时失败。 然后我决定删除我的断言,一切正常!:

cy.server();
cy.route({
  method:'POST',
  url:'/api/v3/table-metas/**',
  onRequest(xhr) {
    console.log('==========BEFORE========');
    console.log('=============AFTER===========');
 }
}).as('getTableMetas');

因此,我认为问题出在我的断言代码中,并使用其他cy方法进行了一些测试,但似乎任何cy.方法都导致完全相同的失败:

cy.server();
cy.route({
  method:'POST',
  url:'/api/v3/table-metas/**',
  onRequest(xhr) {
    console.log('==========BEFORE========');
    cy.log('AAAAAAAAAAAA');
    console.log('=============AFTER===========');
 }
}).as('getTableMetas');

这是赛普拉斯日志的最后一部分的屏幕截图: enter image description here

我在这里做错了什么? 如果它是赛普拉斯的设计行为,那么我应该如何声明传出的请求正文?

将感谢您的任何帮助

1 个答案:

答案 0 :(得分:1)

  

给定别名参数时:

     

cy.wait()产生一个对象,其中包含XHR的HTTP请求和响应属性。 Source

可以通过调用waits方法将属性获取器链接到产生的对象。 例如

it('verifies request body', () => {
  cy.server();
  cy.route({
    method:'POST',
    url:'/api/v3/table-metas/**',
    onRequest(xhr) {
      console.log('==========BEFORE========');
      console.log('=============AFTER===========');
   }
  }).as('getTableMetas');

  // do some action that makes a request to the intercepted request

  cy.waits('@getTableMetas')
    .its('request.body.embedded')
    .should('to.deep.equal', [
      {
        "attributes": {
          "name": "Test Name"
        },
        "type": "test_type"
      }
    ]).debug();
});

更新

onRequest作为回调执行,调用cy.wraps会在执行期间创建一个从未解决的承诺。

我建议在chai回调中使用普通的onRequest断言,因为它们是同步的。

expect(xhr.request.body.embedded).to.deep.equal([
        {
          "attributes": {
            "name": "Test Name"
          },
          "type": "test_type"
        }
      ])