这里有一些背景。 我正在使用用ES6编写的React和Immutable.js来开发一个项目。 我使用Babel和webpack。
我使用Mocha,Chai和jsdom编写了一些单元测试,因此可以在浏览器外执行。
问题是某些组件正在使用诸如需要图像之类的东西。 这个东西由webpack通过特定的加载器处理。
因此,当在终端中运行测试时,由于这些未满足的要求,它们会失败。
我找到了如何通过使用Karma解决这个问题(留下在浏览器之外运行测试的能力)并在运行测试之前编译源代码并使其成为webpack配置只是忽略了图像加载器(使用null-loader) )。
此时,测试是通过Karma运行的,但是其中一些是失败的,而当它们通过终端运行时它们正在通过(我评论了有需求的行,只是为了测试的目的)
失败的测试都与Immutable.js有关,这意味着我试图测试两个不可变对象的相等性。
以下是测试的例子:
it('handles SET_STATE', () => {
const initialState = Map();
const action = {
type : 'SET_STATE',
state : Map({
vote : Map({
pair : List.of('Trainspotting', '28 Days Later'),
tally : Map({ 'Trainspotting' : 1 })
})
})
};
const nextState = reducer(initialState, action);
expect(nextState).to.equal(fromJS({
vote: {
pair: ['Trainspotting', '28 Days Later'],
tally: { 'Trainspotting': 1 }
}
}));
});
失败就是这样的:
1) handles SET_STATE
reducer
AssertionError: expected { Object (size, _root, ...) } to equal { Object (size, _root, ...) }
at Context.<anonymous> (/Users/boris_louboff/Labs/VotingApp/voting-client/test/tests.bundle.js:36413:42 <- webpack:///test/reducer.spec.js:21:29)
所有其他未测试与Immutable相关的测试的测试都在通过。
如果有人知道什么可以解决这个问题,那就太棒了! 谢谢。
答案 0 :(得分:6)
我终于找到了问题所在!!
根据环境(节点或浏览器),期望to.equal似乎表现不同。
const map1 = Map({a: 1, b: 2});
const map2 = Map({a: 1, b: 2});
// In Node
expect(map1).to.equal(map2) // true
// In a browser
expect(map1).to.equal(map2) // false
解决方案是使用Immutable.js API .is()
expect(Immutable.is(map1, map2)).to.be.true // true in both Node and browser !
答案 1 :(得分:3)
虽然您的建议有效,但这是解决问题所需的代码部分:
import chai from 'chai';
import chaiImmutable from 'chai-immutable';
chai.use(chaiImmutable);
添加后,expect(map1).to.equal(map2) // true
在业力中起作用。
但是我没有找到在我的所有测试文件中包含它的方法,就像你可以使用mocha命令
mocha --compilers js:babel-core/register --require ./test/test_helper.js\"test/**/*@(.js|.jsx)\"