2015-12-02 20 views
5

đây là một số ngữ cảnh. Tôi đang làm việc trên một dự án sử dụng React và Immutable.js, được viết bằng ES6. Tôi sử dụng Babel và webpack.Kiểm tra Mocha sử dụng Immutable.js không thành công khi được chạy với Karma

Tôi đã viết một số bài kiểm tra đơn vị bằng cách sử dụng Mocha, Chai và jsdom để chúng có thể được thực thi bên ngoài trình duyệt.

Vấn đề là một số thành phần đang sử dụng những thứ như yêu cầu hình ảnh. Công cụ này được xử lý bởi webpack thông qua trình tải cụ thể.

Vì vậy, khi chạy các thử nghiệm trong thiết bị đầu cuối, chúng không thành công do những yêu cầu không được phép này.

Tôi tìm cách khắc phục điều này bằng cách sử dụng Karma (để lại khả năng chạy thử nghiệm bên ngoài trình duyệt) và biên dịch các nguồn trước khi chạy thử nghiệm và làm cho nó cấu hình webpack chỉ bỏ qua trình tải ảnh (sử dụng null- bộ nạp). Tại thời điểm đó, các bài kiểm tra đang chạy qua Karma nhưng một số trong số họ đang thất bại trong khi họ đang đi qua khi họ được chạy qua thiết bị đầu cuối (tôi đã nhận xét các dòng có yêu cầu công cụ, chỉ cho mục đích của bài kiểm tra).

Kiểm tra không thành công đều liên quan đến Immutable.js có nghĩa là tôi đang cố kiểm tra sự bình đẳng của hai đối tượng không thể thay đổi.

Dưới đây là một dụ của một thử nghiệm:

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

Sự thất bại cho một cái gì đó như thế:

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) 

Tất cả các bài kiểm tra khác mà không được thử nghiệm thứ liên quan đến bất di bất dịch đang đi qua.

Nếu ai đó có bất kỳ ý tưởng nào về những gì có thể giải quyết vấn đề này sẽ tuyệt vời! Cảm ơn bạn.

Trả lời

6

Cuối cùng tôi đã tìm ra vấn đề là gì !!

Kỳ vọng to.equal dường như hoạt động khác nhau tùy thuộc vào môi trường (Nút hoặc trình duyệt).

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 

Các giải pháp là sử dụng .là API Immutable.js()

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

Ok, xin lỗi về thông tin sai lệch này ... Có một cái gì đó tôi hoàn toàn quên mất đó là chạy với môi trường Node ... mô-đun không thay đổi được !!! Nó đã làm công việc làm cho kỳ vọng làm việc !!! Tôi đang cố gắng làm cho nó hoạt động với phiên bản Karma ... – websilone

3

Trong khi đề xuất của bạn hoạt động, đây là một phần của mã cần thiết để giải quyết vấn đề:

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

chai.use(chaiImmutable); 

Sau khi thêm, expect(map1).to.equal(map2) // true hoạt động trong nghiệp chướng. Nhưng tôi đã không tìm thấy một cách để bao gồm này trong tất cả các thử nghiệm của tôi nộp như bạn có thể làm với mocha với lệnh

mocha --compilers js:babel-core/register --require ./test/test_helper.js\"test/**/*@(.js|.jsx)\" 
Các vấn đề liên quan