2015-12-02 20 views
5

tutaj jest jakiś kontekst. Pracuję nad projektem przy użyciu React i Immutable.js, napisanym przy użyciu ES6. Używam Babel i webpacka.Próby mokka przy użyciu Immutable.js kończą się niepowodzeniem, gdy są uruchamiane z karmą

Napisałem kilka testów jednostkowych za pomocą Mocha, Chai i jsdom, aby mogły być wykonane poza przeglądarką.

Problem polega na tym, że niektóre elementy używają takich elementów, jak obrazy wymagające. Te rzeczy są obsługiwane przez pakiet sieci Web za pośrednictwem konkretnego programu ładującego.

Tak więc podczas przeprowadzania testów w terminalu, zawodzą one z powodu tych nieoczekiwanych wymagań.

Znalazłem, jak rozwiązać ten problem, używając Karmy (pozostawiając za sobą możliwość uruchamiania testów poza przeglądarką) i kompilując źródła przed uruchomieniem testów i tak, aby konfiguracja pakietu sieciowego ignorowała program ładujący obrazy (za pomocą polecenia null- ładowarka).

W tym momencie testy są przeprowadzane za pośrednictwem Karmy, ale niektóre z nich ulegają awarii podczas przechodzenia przez terminal (skomentowałem linie, w których było wymagane, tylko na potrzeby testu).

Test, który zawodzi, jest powiązany z Immutable.js, co oznacza, że ​​próbuję przetestować równość dwóch niezmiennych obiektów.

Oto exemple testu:

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 } 
     } 
    })); 
}); 

Porażka daje coś takiego:

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) 

wszystkie inne testy, które nie testują rzeczy związanych z niezmiennymi mijają.

Jeśli ktoś ma pojęcie, co mogłoby rozwiązać ten problem, to byłoby wspaniale! Dziękuję.

Odpowiedz

6

W końcu znalazłem problem!

Wygląda na to, że wartość .equal zachowuje się inaczej w zależności od środowiska (węzeł lub przeglądarka).

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 

Rozwiązaniem jest użycie .is API Immutable.js()

expect(Immutable.is(map1, map2)).to.be.true // true in both Node and browser ! 
+1

Ok, przepraszam o tym mylących informacji ... Jest coś, co całkowicie zapomniał o której działa z środowiskiem Węzłów ... moduł niezmiennego chai !!! To było zadanie polegające na tym, aby oczekiwanie zadziałało !!! Próbuję działać z wersją Karma ... – websilone

3

Podczas gdy sugestia działa, jest to część kodu potrzebne do rozwiązania problemu:

import chai from 'chai'; 
import chaiImmutable from 'chai-immutable'; 

chai.use(chaiImmutable); 

Po dodaniu, expect(map1).to.equal(map2) // true działa w karmie. Ale nie znaleźć sposób na to to we wszystkich moich testów złożyć jak można zrobić z mokka z poleceniem

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