cypress - 如何在 Cypress 断言中部分比较深度嵌套的对象?

标签 cypress chai web-api-testing

我正在使用 Cypress作为我的 API 和 UI 测试自动化框架。我已经编写了多个正在运行和通过的 API 测试,但它们只是验证 response.status返回 200 .我想比较来自 GET 的响应 json针对存储的“预期”响应以确认 JSON 响应数据正确。
我尝试了 to.deep.equal 的不同变体和 deepEquals在我的 .then(response => {}代码块。但我不想验证只有一个字段返回正确的值,我想验证一堆不同的字段是否返回正确的值。我的 GET request 返回超过 100 行嵌套的 JSON 字段/值,我只想验证相互嵌套的 20 个左右的字段/值。

cy.request({
    method: 'GET',
    log: true,
    url: 'https://dev.api.random.com/calculators/run-calculate/524/ABC',

    headers: {
        'content-type': 'application/json',
        'x-api-key': calcXApiKey
    },
    body: {}
}).then(response => {
    const respGet = response.body
    const tPrice = response.body.data.calculations.t_costs[0].comparison.t_price
    cy.log(respGet, tPrice)
    assert.deepEqual({
        tPrice
    }, {
        t_price: '359701'
    })
       // assert.equal(response.status, 200) -- This works great
})
错误= expected { tPrice: undefined } to deeply equal { t_price: 359701 }

最佳答案

在您的示例中,您正在比较对象 { tPrice: tPrice }{ t_price: '359701' } ,这就是为什么它总是会失败,因为键是不同的(除了 tPrice 变量值是 undefined 的事实)。

如果您已经将实际值存储在变量中,则无需从中创建对象并使用 deepEqual .你可以做:

const tPrice = response.body.data.calculations.t_costs[0].comparison.t_price
assert.equal(tPrice, '359701');

至于你的另一个问题,如果我理解正确的话,你的回答是这样的:
{
  data: {
    calculations: {
      t_costs: [
        { comparison: { t_price: "1111" } },
        { comparison: { t_price: "2222" } },
        { comparison: { t_price: "3333" } },
        { comparison: { t_price: "4444" } },
        /* ... */
      ]
    }
  }
}

并且您只想断言其中的几个 t_costs对象。

为此,最好使用 chai 插件,例如 debitoor/chai-subset .

要设置它:

npm install --save-dev chai-subset

在您的 cypress/support/index.js :

const chai = require('chai');
const chaiSubset = require('chai-subset');
chai.use(chaiSubset);

在您的规范中:

/* ... */
expect( response.body.data.calculations.t_costs )
    .to.containSubset([
        { comparison: { t_price: "1111" } },
        { comparison: { t_price: "3333" } }
    ]);

关于cypress - 如何在 Cypress 断言中部分比较深度嵌套的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57697282/

相关文章:

vue.js - Cypress Vue 组件测试从已挂载发出的事件

JSON Stringify 函数返回相等,但 chai 的 equal 函数返回不相等

web-services - SOAP UI/SOAP UI PRO 中的 Content-Type application/soap+msbin1

javascript - 嵌套 promise 返回未定义

javascript - module.exports = Promise.all 在测试中不起作用

javascript - 如何断言标题包含 Chakram 中的特定值

postman - 如何在POSTMAN环境中添加授权头?

javascript - 如何使用 Cypress 获取 javascript 弹出窗口中的内容?

reactjs - 如何在 Cypress 测试中公开/访问像 Redux 这样的数据存储?

local-storage - 断言 localStorage 值始终为 null