2015-12-02 176 views
5

这里是一些上下文。 我正在使用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) 

所有这一切都没有相关的测试不可改变的东西都超过了其他测试。

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

回答

6

我终于找到了问题所在!

根据环境(节点或浏览器),对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 ! 
+1

好吧,抱歉这个误导性的信息......有件事我完全忘了这是与Node环境一起运行...... chai-immutable模块!!!它正在做预期工作的工作!我试图使它与Karma版本一起工作... – websilone

3

虽然你的建议的作品,这是解决问题所需的代码部分:

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)\"