我希望有一种更简单的方法来对对象进行空检查,以使其具有空数组

时间:2019-03-22 15:54:14

标签: javascript chai

我正在用chai和sinon编写一些测试。

我有这个对象:

{
    payload: {
        foo: 'bar',
        bar: []
    },
    type: 'FOO:BAR'
}

我想写一个期望,该对象包含一个称为bar的属性,它是一个空对象。

我有foo的这个东西:

expect(myObject).to.have.property('foo', 'bar')

哪一个很好而简洁。将它与这个相当长的期望进行比较:

expect(myObject).to.have.property('bar').that.is.an('array').with.property('length', 0)

之所以这样写,是因为如果我使用property('bar', [])时属性会通过引用进行比较,并且基于此cheatcheet中的示例(请参见属性部分)。

写这种期望的方式是否较为冗长?

1 个答案:

答案 0 :(得分:0)

由于您已经在使用sinon,因此可以使用sinon.assert.match进行测试:

  

该值...不是nullundefined,并且至少具有与expectation相同的属性

这会检查obj至少包含 payload,其中期望值分别为foobar

const sinon = require('sinon');

const obj = {
  payload: {
    foo: 'bar',
    bar: []
  },
  type: 'FOO:BAR'
};

it('should match', () => {
  sinon.assert.match(obj, {
    payload: {
      foo: 'bar',
      bar: []
    }
  });  // Success!
});

另一种选择(看起来是@Xufox首先在评论中建议的)是chai中的.eql

  

断言目标与给定的obj完全相等

这将检查obj.payload{ foo: 'bar', bar: [] }的深度是否相等:

const expect = require('chai').expect;

const obj = {
  payload: {
    foo: 'bar',
    bar: []
  },
  type: 'FOO:BAR'
};

it('should match', () => {
  expect(obj.payload).to.eql({
    foo: 'bar',
    bar: []
  });  // Success!
});