Как частично сравнить глубоко вложенные объекты в утверждениях Cypress?

Я использую cypress.io в качестве своей платформы автоматизации для тестов API и UI. Я написал несколько тестов API, которые выполняются и проходят, но они только подтверждают, что response.status возвращает 200. Я хочу сравнить ответ json от GET с сохраненным «ожидаемым» ответом, чтобы подтвердить правильность данных ответа json.

Я пробовал разные варианты to.deep.equal и deepEquals в моем .then(response => {} блоке кода. Но я не хочу проверять, что только одно поле возвращает правильное значение, я хочу проверить, возвращает ли несколько разных полей правильные значения. Мой запрос GET возвращает более 100 строк вложенных полей / значений json, и я хочу проверить только 20 или около того полей / значений, вложенных друг в друга.

* Примечание: игнорируйте revId, это из более раннего запроса.

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

    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 }


person Chase Small    schedule 28.08.2019    source источник


Ответы (1)


В вашем примере вы сравниваете объект { 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" } }
    ]);
person dwelle    schedule 29.08.2019
comment
Это отлично сработало. Спасибо большое за вашу помощь. Это намного проще, чем я делал, ха-ха. - person Chase Small; 29.08.2019
comment
Имейте в виду, chai-subset работает, но отчеты об ошибках ужасны. Вам нужно вручную проанализировать, почему это не удается. Нет явной ошибки в том, где поле не совпадает. - person Max Liashuk; 16.12.2020