2016-06-15 18 views
3

I-Tests für meine Handlungen zu schreiben, dass die Verwendung vonUnit-Tests reagieren Aktionen - browserHistory ist nicht definiert

{ browserHistory } from 'react-router'; 

Und wenn ich meine Tests renne, importiert browserHistory aus unbekannten Gründen nicht definiert ist. Daher löst test einen Fehler aus - "Eigenschaft kann nicht gelesen werden 'push' von undefined"; Ich weiß nicht, warum BrowserHistory nicht definiert ist, wenn es in meiner App funktioniert. Kann mir jemand helfen?

Antwort

11

Ich rate, dass Sie nicht Karma oder einen Browser verwenden, um Ihren Test auszuführen. Das Objekt browserHistory ist nicht definiert, wenn kein Browser vorhanden ist. Möglicherweise müssen Sie sinon verwenden, um Ihre browserHistory zu stubben. So etwas wie die folgenden vielleicht hilfreich:

import chai from 'chai'; 
import sinonChai from 'sinon-chai'; 
import componentToTest from './component-to-test' 
import sinon from 'sinon'; 
import * as router from 'react-router'; 

var expect = chai.expect; 
chai.use(sinonChai); 

describe('Test A Component',() => { 

    it('Should success.',() => { 
     router.browserHistory = { push:()=>{} }; 
     let browserHistoryPushStub = sinon.stub(router.browserHistory, 'push',() => { }); 
     //mount your component and do your thing here 
     expect(browserHistoryPushStub).to.have.been.calledOnce; 

     browserHistoryPushStub.restore(); 
    }); 

}); 
+0

Der Schlüssel für mich in dieser Antwort war der Import der gesamten 'router' statt nur' browserHistory' oder 'hashHistory', das ist Wie ich versuchte es zu verspotten. –

1

Wenn Uhr mit (npm run test -- --watch), musste ich die ursprüngliche router.browserHistory Speichern und Wiederherstellen der Invariant Violation (unten) zu vermeiden.

import * as router from 'react-router' 

describe('some description',() => { 
    const oldBrowserHistory = router.browserHistory 
    after(() => { router.browserHistory = oldBrowserHistory }) 

    it('some expectation',() => { 
    const spy = sinon.spy() 
    router.browserHistory = { push: spy } 

    // call your code here 

    expect(spy.withArgs(expectedArgs).calledOnce).to.be.true 
    }) 
}) 

unveränderliche Verletzung: Sie haben eine Geschichte Objekt erstellt mit Geschichte v2.x oder früher zur Verfügung gestellt. Diese Version von React Router ist nur mit v3-Verlaufsobjekten kompatibel. Bitte upgrade auf den Verlauf v3.x.

(Kredit für immer mich auf dem richtigen Weg begann zu user3682091)