React-Router:使用酶在`render`道具内部进行测试

时间:2018-07-09 11:24:21

标签: javascript reactjs react-router jestjs enzyme

我想测试从/路径到语言环境路径(例如/en)的重定向。所以这是该组件的外观:

// GuessLocale is imported from a helper
const App = () => (
<Router>
  <Switch>
    <Route exact path='/' render={() => (
      <Redirect to={`/${guessLocale()}`} />
    )} />
    <Route exact path='/:lang' component={Home} />
  </Switch>
</Router>
)

这是当前的测试功能:

it('redirects to a localed path', () => {
  const wrapper = mount(
    <MemoryRouter initialEntries={['/']}>
      <App />
    </MemoryRouter>
  )

  expect(wrapper.find('Redirect')).toHaveLength(1)
})

很明显,测试失败,因为Redirect组件作为render的{​​{1}}道具的功能在子级内部

在测试中,我将App封装在内存路由器中,但是在App组件中,已经存在浏览器路由器,因此我可能需要对其进行重构。

但是即使将路由拆分为Routes组件,我也不知道如何在Route道具中进行测试。

1 个答案:

答案 0 :(得分:1)

您可以通过检查重定向后应呈现的组件来进行测试,在这种情况下,Home组件应如下所示:

it('redirects to a localed path', () => {
  let wrapper = mount(
    <MemoryRouter initialEntries={['/']}>
      <Switch>
        <Route exact path='/' render={() => (
          <Redirect to={`/en`} />
        )} />
        <Route path='/en' component={Home} />
        <Route render={() => "not found"} />
      </Switch>
    </MemoryRouter>
  )



  expect(wrapper.find(Home)).toHaveLength(1)
})

我必须删除<Router>才能使它正常工作,因为我们没有在浏览器中使用它。这样做的另一种方法是检查location属性中的<Route>路径名属性。看到这里:

it('redirects to a localed path', () => {
  let wrapper = mount(
    <MemoryRouter initialEntries={['/']}>
      <Switch>
        <Route exact path='/' render={() => (
          <Redirect to={`/en`} />
        )} />
        <Route path='/en' component={Home} />
        <Route render={() => "not found"} />
      </Switch>
    </MemoryRouter>
  )



  expect(wrapper.find("Route").prop('location').pathname).to.equal("/en")
})