2015-02-18 7 views
9

Voglio testare i metodi AJAX (vaniglia XHR) e non riesco a trovare il modo di farlo con il framework Jest. Ho trovato mock-ajax.js per Jasmine, il problema è che non riesco a trovare il modo di installarlo.Test XHR in Jest

C'è forse un modo migliore per Unit Test Ajax funziona in Jest?

risposta

8

È possibile testare XHR in Jest senza pacchetti aggiuntivi. Questo è funzione di supporto che crea oggetto fittizio per 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); 
} 

e si può utilizzare in test come segue:

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

credo che questo sia ormai 'jest.fn() mockImplementation' dalle [doc] (https://facebook.github.io /jest/docs/en/mock-function-api.html#mockfnmockimplementationfn) – Peter

3

L'API scherzo ha cambiato un po '. Questo è quello che uso. Non fa nulla ma è abbastanza per rendere i miei componenti.

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

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

e nel file di prova:.

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