5

这是一些上下文。我正在使用 ES6 编写的 React 和 Immutable.js 开发一个项目。我使用 Babel 和 webpack。

我使用 Mocha、Chai 和 jsdom 编写了一些单元测试,以便它们可以在浏览器之外执行。

问题是某些组件正在使用诸如需要图像之类的东西。这些东西是由 webpack 通过特定的加载器处理的。

因此,在终端中运行测试时,它们会因为这些意外要求而失败。

我找到了如何通过使用 Karma 来解决这个问题(保留在浏览器之外运行测试的能力)并在运行测试之前编译源代码并使其 webpack 配置忽略图像加载器(使用 null-loader)。

那时,测试正在通过 Karma 运行,但其中一些测试失败,而当它们通过终端运行时它们正在通过(我评论了需要东西的行,只是为了测试的目的)。

失败的测试都与 Immutable.js 有关,这意味着我正在尝试测试两个 Immutable 对象的相等性。

这是一个测试的例子:

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 相关的测试都通过了。

如果有人对什么可以解决这个问题有任何想法,那就太好了!谢谢你。

4

2 回答 2

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 !
于 2015-12-02T13:48:05.793 回答
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)\"
于 2016-05-19T13:02:26.930 回答