2015-02-18 25 views
9

Tôi muốn thử nghiệm các phương pháp AJAX (vanilla XHR) và tôi không thể tìm ra cách để thực hiện nó với khung công tác Jest. Tôi tìm thấy mock-ajax.js cho Jasmine, vấn đề là tôi không thể tìm thấy cách để cài đặt nó.Thử nghiệm XHR trong Jest

Có cách nào tốt hơn để thử nghiệm các chức năng Ajax đơn vị trong Jest?

Trả lời

8

Bạn có thể kiểm tra XHR trong Jest mà không cần gói bổ sung. Đây là chức năng helper mà tạo ra đối tượng giả cho XMLHttpRequest:

let open, send, onload, onerror; 

function createXHRmock() { 
    open = jest.genMockFn(); 

    // be aware we use *function* because we need to get *this* 
    // from *new XmlHttpRequest()* call 
    send = jest.genMockFn().mockImpl(function(){ 
     onload = this.onload.bind(this); 
     onerror = this.onerror.bind(this); 
    }); 

    const xhrMockClass = function() { 
     return { 
      open, 
      send 
     }; 
    }; 

    window.XMLHttpRequest = jest.genMockFn().mockImpl(xhrMockClass); 
} 

Và bạn có thể sử dụng nó trong thử nghiệm như sau:

it('XHR success',() => { 
    createXHRmock(); 

    // here you should call GET request 

    expect(open).toBeCalledWith('GET', 'http://example.com', true); 
    expect(send).toBeCalled(); 

    // call onload or onerror 
    onload(); 

    // here you can make your assertions after onload 
}); 
+0

Tôi nghĩ rằng đây tại là 'jest.fn() mockImplementation' từ [tài liệu] (https://facebook.github.io /jest/docs/en/mock-function-api.html#mockfnmockimplementationfn) – Peter

3

Các api jest đã thay đổi một chút. Đây là những gì tôi sử dụng. Nó không làm bất cứ điều gì nhưng nó đủ để render các thành phần của tôi.

const xhrMockClass =() => ({ 
    open   : jest.fn() 
, send   : jest.fn() 
, setRequestHeader: jest.fn() 
}) 

window.XMLHttpRequest = jest.fn().mockImplementation(xhrMockClass) 

và trong file kiểm tra:.

import '../../__mock__/xhr-mock.js'

Các vấn đề liên quan