组件内部多个测试的适当模拟功能

时间:2021-01-05 09:43:08

标签: reactjs function jestjs mocking react-testing-library

很遗憾,我找不到我的问题的答案。如果它已经存在,可能有人可以推荐我。

我在 React 组件中使用模拟函数进行多个测试时遇到问题。 例如组件 Login 包含名为 useAuthState 的钩子,在我的测试中,我像这样模拟它:

jest.mock('../state/useAuthState', () => 
   jest.fn(() => (require('./useAuthStateTest').default as any)()))

const renderLogin = () => {
   const Login = require('../components/Login').default
   return render(<Login />)
}

test('some test 1' () => {
    renderLogin()
})

test('some test 2' () => {
    renderLogin()
})

第一个测试 some test 1 执行成功,但 some test 2 抛出错误:

<块引用>

TypeError: (0 , _useAuthState.default) 不是函数或其 返回值不可迭代

如果我将 some test 1 注释掉,那么 some test 2 将通过。为什么我不能在组件内模拟多个测试的功能?我在文档中遗漏了什么?

1 个答案:

答案 0 :(得分:0)

我发现了问题,

而不是使用此代码:

jest.mock('../state/useAuthState', () => 
   jest.fn(() => (require('./useAuthStateTest').default as any)()))

需要替换成这个:

jest.mock('../state/useAuthState', () => 
     require('./useAuthStateTest').default)

它适用于一个文件中的多个测试。

总结一下这种方法(如 Internet 上的 tutorial 中描述的)对于一个文件中的多个测试不起作用(模拟 React 组件中的函数):

jest.mock('something_to_mock', () => 
    jest.fn(() => ...))

如果我们替换为这个代码:

 jest.mock('something_to_mock', () => 
        (() => ...))

它会起作用。

不知道为什么。也许对reactjs非常了解的人可以解释一下。

要复制这个问题,你可以使用这个简单的测试项目: