2017-05-19 29 views
2

鉴于以下组件:用一个玩笑测试用例阵营阿波罗时“无法读取空的财产_location”

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

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

export default graphql(Query)(MatchListRouteHandler); 

而且测试用例:

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

我收到以下错误,当Jest试图运行测试用例:

/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) 

回答

1

这个刚一说明。我今天碰到这个错误来了,也与阿波罗+玩笑,但我在什么可能是一个更优雅的方式,不知道固定,但我卸除在afterEach被测试的组件。

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

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

这似乎是因为Jest测试过程退出得太快;阿波罗试图继续要求您提供后的应用程序被安装在数据,但响应不会发生,直到后的测试已经结束,从而导致整个玩笑亚军退出这个神秘的错误信息。

这可以通过有关的测试之前,人为地增加了立即补救结束,即:

​​

注意,这并不完全修复错误(实际上,上述测试将永远传递),但这确实意味着你的整个测试运动员不会完全爆炸。

正确答案或许涉及在测试中使用Server Side Rendering