使用Immutable.js进行摩卡测试失败时与Karma运行
问题描述:
这里是一些上下文。 我正在使用React和Immutable.js编写一个使用ES6编写的项目。 我使用Babel和webpack。使用Immutable.js进行摩卡测试失败时与Karma运行
我使用Mocha,Chai和jsdom编写了一些单元测试,以便它们可以在浏览器之外执行。
问题是,一些组件正在使用像需要图像的东西。 这个东西是由webpack通过特定的加载器来处理的。
因此,在终端中运行测试时,它们会因为这些未预料到的要求而失败。
我发现如何通过使用Karma(留下在浏览器外部运行测试的能力)修复此问题并在运行测试之前编译源代码,并使其成为webpack配置而忽略图像加载器(使用null-装载机)。
在这一点上,测试通过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)
所有这一切都没有相关的测试不可改变的东西都超过了其他测试。
如果有人对什么可以解决这个问题有什么想法,那就太棒了! 谢谢。
答
我终于找到了问题所在!
根据环境(节点或浏览器),对e.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。是()
expect(Immutable.is(map1, map2)).to.be.true // true in both Node and browser !
答
虽然你的建议的作品,这是解决问题所需的代码部分:
import chai from 'chai';
import chaiImmutable from 'chai-immutable';
chai.use(chaiImmutable);
添加后,expect(map1).to.equal(map2) // true
在业力工作。 但我没有找到一种方法,包括这在我所有的测试文件中像您可以用摩卡做命令
mocha --compilers js:babel-core/register --require ./test/test_helper.js\"test/**/*@(.js|.jsx)\"
好吧,抱歉这个误导性的信息......有件事我完全忘了这是与Node环境一起运行...... chai-immutable模块!!!它正在做预期工作的工作!我试图使它与Karma版本一起工作... – websilone