Сопоставьте частичные объекты в утверждениях Чая?

Я ищу лучший способ соответствовать следующему:

expect([
    {
        C1: 'xxx',
        C0: 'this causes it not to match.'
    }
]).to.deep.include.members([
    {
        C1: 'xxx'
    }
]);

Выше не работает, потому что C0 существует в фактическом, но не ожидаемый. Короче говоря, я хочу, чтобы это ожидалось, чтобы пройти, но я не уверен, как это сделать, не написав кучу собственного кода...

Ответ 1

chai-subset или chai-fuzzy также могут выполнить то, что вы ищете.

Chai-subset должен работать так:

expect([
  {
    C1: 'xxx',
    C0: 'this causes it not to match.'
  }
]).to.containSubset([{C1: 'xxx'}]);

Лично, если я не хочу включать другой плагин, я буду использовать property или keys соответствия, которые включает в себя Chai:

([
  {
    C1: 'xxx',
    C0: 'this causes it not to match.'
  }
]).forEach(obj => {
  expect(obj).to.have.key('C1'); // or...
  expect(obj).to.have.property('C1', 'xxx');
});

Ответ 2

Есть несколько разных плагинов, которые решают эту проблему. Я фанат мелкого-глубокого-равного. Вы бы использовали это так:

expect([
    {
      C1: 'xxx',
      C0: 'this causes it not to match.'
    }
  ]).to.shallowDeepEqual([
    {
      C1: 'xxx'
    }
  ]);

Ответ 4

Я считаю, что самым простым (и, конечно же, самым простым) способом было бы:

var actual=[
  {
    C1:'xxx',
    C0:'yyy'
  }
];

actual.forEach(function(obj){
  expect(obj).to.have.property('C1','xxx');
});

Ответ 5

Я написал chai-match-pattern и lodash-match-pattern для обработки сценариев с неполным соответствием (и многих других).

var chai = require('chai');
var chaiMatchPattern = require('chai-match-pattern');
chai.use(chaiMatchPattern);

// Using JDON pattern in expectation
chai.expect([
  {
    C1: 'xxx',
    C0: 'this causes it not to match.'
  }
]).to.matchPattern([
  {
    C1: 'xxx',
    '...': ''
  }
]);

// Using the slightly cleaner string pattern notation in expectation
chai.expect([
  {
    C1: 'xxx',
    C0: 'this causes it not to match.'
  }
]).to.matchPattern(`
  [
    {
      C1: 'xxx',
      ...
    }
  ]
  `
);

Ответ 6

Немного обновленная версия #RobRaisch, потому что для пустого сравнения выдается ошибка, потому что '' не равно ''

let expected = {
            dateOfBirth: '',
            admissionDate: '',
            dischargeDate: '',
            incidentLocation: null
        };
        Object.keys(expected).forEach(function(key) {
            expect(actual[key]).to.equal(expected[key]);
        });

Ответ 7

Вы можете использовать функции pick и omit подчеркивания, чтобы выбрать/отклонить свойства для проверки:

const { pick, omit } = require('underscore');

const obj = {
  C1: 'xxx',
  C0: 'this causes it not to match.',
};

it('tests sparse object with pick', () => {
  expect(pick(obj, 'C1')).to.eql({ C1: 'xxx' });
});

it('tests sparse object with omit', () => {
  expect(omit(obj, 'C0')).to.eql({ C1: 'xxx' });
});