如何使用 jest.spyOn 测试 RTKQuery 端点

use*_*707 5 javascript testing redux redux-toolkit rtk-query

我正在尝试测试 RTKQuery 是否已使用 jest 调用端点。

我最终还希望能够模拟返回数据是什么,但首先我只想检查挂钩是否已被调用。

在下面的示例中,我试图监视 myApi 以获取自动生成的 useGetMyListQuery 挂钩。

运行时会抛出错误,有人可以帮忙吗?

it('Should render', async () => {
    jest.spyOn(myApi, 'useGetMyListQuery')

    render(
      <Provider store={store}>
        <MyComponent />
      </Provider>
    )

    expect(myApi.useGetMyListQuery).toBeCalled()
})
Run Code Online (Sandbox Code Playgroud)

phr*_*hry 14

我无法回答您关于如何通过开玩笑来做到这一点的问题,但我希望我可以在这里给您一些见解 - 从编写大部分 RTKQ 的角度以及我如何想象它以稳定的方式进行测试:

我不会用玩笑来嘲笑。我会嘲笑 API。

原因是您的模拟将假设 RTKQ 挂钩的某些返回值 - 如果您的假设错误,您可能会有一个很好的绿色运行测试,但实际上您的应用程序仍然会失败。

一个例子是使用skip而不检查isUninitialized- 因为如果您不使用,则不会出现这种情况skip,并且您可能只是假设您只会在组件中看到isLoading,isSuccess和情况。isError在许多情况下,这是一个完全有效的假设,但并不总是正确的。模拟 RTKQ 会将由此产生的错误隐藏在绿色测试后面。

相反,我建议使用模拟服务工作者之类的东西来模拟您的 api 端点,并让 RTKQ 完成它的工作。这就是我们在自己的测试中测试 RTKQ 的方式 - 欢迎您查看:RTKQ 测试