我正在尝试遵循 urql 文档的身份验证指南。 让我们从最小的上下文开始:我有一个 React 应用程序和一个 graphql 服务器。我们正在引入刷新令牌功能,我正在 Web 客户端上实现刷新令牌流。为此,我修改了客户端配置以具有
authExchange
,它返回一组将用于处理特定身份验证操作的函数,例如:didAuthError
、addAuthToOperation
、async refreshAuth
.
我的理解是
didAuthError
有判断服务器返回的错误是否应该触发refreshAuth
的逻辑。到现在为止,当我在浏览器上尝试应用程序时,我已经成功地实现了这一点,只要服务器返回 401 错误消息:token has expired
在`refreshAuth 中实现的刷新令牌突变被调用并且新的令牌对用于重试之前的请求,一切正常。综上所述,我面临的问题是我无法在我正在编写的测试中重现这个(urql docs about testing)。
const TestComponent = () => {
const [res, execute] = useQuery({ query: 'query{ user {name }}' })
return <div></div>
}
it('refreshToken', async () => {
clientConfig.executeQuery = jest.fn()
.mockReturnValueOnce(
fromValue({
error: new CombinedError({
networkError: new Error('token has expired'),
}),
}),
)
.mockReturnValueOnce(fromValue({
data: { user: { name: 'user name' } }
}))
const wrapper = renderer.create(
<Provider value={clientConfig}>
<TestComponent />
</Provider>)
expect(clientConfig.executeQuery).toHaveBeenCalledTimes(2);
});
expect(jest.fn()).toHaveBeenCalledTimes(expected)
Expected number of calls: 2
Received number of calls: 1
我通过添加一些日志注意到的一件事是
didAuthError
返回的authExchange
没有在测试中执行。