2015-12-02 179 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)\"