2017-05-19 3 views
2

die folgenden Komponente Gegeben:"Can not Eigenschaft _Ort von null lesen", wenn in einem Jest Testfall Reagiert Apollo mit

export function App() { 
    return withApollo(<BrowserRouter> 
    <MatchListRouteHandler /> 
    </BrowserRouter>); 
} 

// MatchListRouteHandler 
export const Query = addTypenameToDocument(gql` 
    query GetMatches { 
    matches { 
     id 
    } 
    } 
`); 

export default graphql(Query)(MatchListRouteHandler); 

Und den Testfall:

it('renders without crashing',() => { 
    const div = document.createElement('div'); 
    ReactDOM.render(<App />, div); 
}); 

ich folgende Fehlermeldung erhalten, wenn Jest versucht, den Testfall auszuführen:

/home/dan/match-history-analyser/node_modules/jsdom/lib/jsdom/browser/Window.js:148 
     return idlUtils.wrapperForImpl(idlUtils.implForWrapper(window._document)._location); 
                      ^

TypeError: Cannot read property '_location' of null 
    at Window.get location [as location] (/home/dan/Projects/match-history-analyser/node_modules/jsdom/lib/jsdom/browser/Window.js:148:79) 
    at Timeout.callback [as _onTimeout] (/home/dan/Projects/match-history-analyser/node_modules/jsdom/lib/jsdom/browser/Window.js:525:40) 
    at ontimeout (timers.js:386:14) 
    at tryOnTimeout (timers.js:250:5) 
    at Timer.listOnTimeout (timers.js:214:5) 

Antwort

1

Nur eine Anmerkung zu diesem. Ich bin heute, auch mit Apollo + Jest, auf diesen Fehler gestoßen, aber ich habe mich auf eine elegantere Art und Weise festgelegt, nicht sicher, aber ich habe die Komponenten, die getestet werden, in einem AfterEach-System abgehängt.

beforeEach(() => { 
    wrapper = mount(<Root location={ '/route/' } context={context} />); 
}) 

afterEach(() => { 
    wrapper.unmount(); 
}); 
2

Dies scheint zu auftreten, da der Jest-Testprozess zu schnell beendet wird; Apollo versucht weiterhin, die von Ihnen bereitgestellten Daten anzufordern nach die App wurde gemountet, aber die Antwort tritt nicht auf nach der Test wurde beendet, was zu dieser kryptischen Fehlermeldung, die den gesamten Jest Runner zu beenden verursacht .

it('renders without crashing', (done) => { 
    const div = document.createElement('div'); 
    ReactDOM.render(<App />, div); 

    setTimeout(() => done()); 
}); 

Beachten Sie, dass der Fehler dadurch nicht behoben werden vollständig (eigentlich oben, Ihr Test wird immer passieren), aber:

Dies kann durch eine künstliche Erhöhung der Verzögerung vor dem Test in Frage endet, dh behoben werden Es bedeutet, dass dein gesamter Testläufer nicht komplett bombardiert wird.

Die richtige Antwort wahrscheinlich beinhaltet Server Side Rendering in Ihren Tests.

Verwandte Themen