为数组和对象扩展immutable.is

时间:2018-10-22 19:47:58

标签: javascript immutable.js

我正在寻找一种简单的方法来深度比较可以包含Immutable.js对象的对象和数组。为了使编写测试更加容易。

查看以下内容。 (根据immutable.js网站上的示例代码进行修改)

const { Map, is, List } = require('immutable@4.0.0-rc.10')
const map1 = Map({ a: 1, b: 1, c: 1 })
const map2 = Map({ a: 1, b: 1, c: 1 })
assert.equal(map1 !== map2, true)
assert.equal(Object.is(map1, map2), false)
assert.equal(is(map1, map2), true)
assert.equal(is(List([map1, map2]), List([map1, map2])), true)
assert.equal(is(Map({map1, map2}), Map({map1, map2})), true)
/* I'd like these last two to be true */
assert.equal(is([map1, map2], [map1, map2]), true) // fails
assert.equal(is({map1, map2}, {map1, map2}), true) // fails

是否有任何现有的库或函数可以做到这一点?或者,如果我正在编写自己的比较器,是否有一种简便的方法来发现不可变的记录,列表和地图?

1 个答案:

答案 0 :(得分:0)

我相信以下使用Chai's .deep property的测试可以显示您正在寻找的行为:

const {expect} = require('chai');
const {Map, List} = require('immutable');

describe('this stuff', () => {
  const map1 = Map({a: 1, b: 1, c: 1});
  const map2 = Map({a: 1, b: 1, c: 1});
  it('should behave itself', () => {
    expect(map1).not.to.equal(map2);
    expect(Object.is(map1, map2)).to.be.false;
    expect(map1).to.deep.equal(map2);
    expect(List([map1, map2])).to.deep.equal(List([map1, map2]));
    expect(Map({map1, map2})).to.deep.equal(Map({map1, map2}));
    expect([map1, map2]).to.deep.equal([map1, map2]);
    expect({map1, map2}).to.deep.equal({map1, map2});
  });
});

或者,不使用Chai(特别是如果用例在测试套件中不是 时特别有用):

assert([map1, map2].every((map, i) => is(map, [map1, map2][i])));
assert(Object.values({map1, map2}).every((map, i) => is(map, Object.values({map1, map2})[i])));