【问题标题】:Mocha tests using Immutable.js are failing when runned with Karma使用 Immutable.js 的 Mocha 测试在使用 Karma 运行时失败
【发布时间】:2015-12-02 10:54:16
【问题描述】:

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

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

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

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

我发现了如何通过使用 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 相关的测试都通过了。

如果有人知道什么可以解决这个问题,那就太好了! 谢谢。

【问题讨论】:

    标签: webpack mocha.js immutable.js karma-mocha chai-immutable


    【解决方案1】:

    我终于找到问题所在了!!

    对.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 !
    

    【讨论】:

    • 好的,很抱歉这个误导性信息......我完全忘记了在节点环境中运行的东西...... chai-immutable 模块!它正在做使期望起作用的工作!我正在尝试使其适用于 Karma 版本...
    【解决方案2】:

    虽然您的建议有效,但这是解决问题所需的代码部分:

    import chai from 'chai';
    import chaiImmutable from 'chai-immutable';
    
    chai.use(chaiImmutable);
    

    添加后,expect(map1).to.equal(map2) // true 在 karma 中工作。 但是我没有找到一种方法将它包含在我的所有测试文件中,就像你可以用命令使用 mocha 所做的那样

    mocha --compilers js:babel-core/register --require ./test/test_helper.js\"test/**/*@(.js|.jsx)\"
    

    【讨论】:

      猜你喜欢
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多