我试图模拟useMutation,它有一个名为onError的参数。正如下面的代码所描述的那样,我正在使用它。
每当使用useRedirectOnErrorMutation时,都会将带有令牌的标头附加到请求中,因此,如果令牌无效,将出现401错误响应,我将在onError函数中捕获该响应,该响应随useMutation一起提供,并将用户重定向到登录页面。
export const useRedirectOnErrorMutation = <
TData = unknown,
TError = unknown,
TVariables = void,
TContext = unknown
>(
redirectionPath: string,
key: MutationKey,
mutationFunction: MutationFunction<TData, TVariables>,
options?: UseMutationOptions<TData, TError, TVariables, TContext>
): UseMutationResult<TData, TError, TVariables, TContext> => {
const router = useRouter();
console.log(useMutation);
return useMutation(key, mutationFunction, {
...options,
onError: (error) => {
if (error?.response.status == "401" || error?.response.status == "422") {
localStorage.removeItem("token");
localStorage.removeItem("userId");
router.push(redirectionPath);
}
},
});
};
上面的代码工作得很好,现在我必须对这个功能进行100%的测试。
我目前对该功能的测试实现如下。
describe("(when api call gives error", () => {
it("should return the response", () => {
const push = jest.fn();
let onError: (
error: any,
variables: any,
context: any | undefined
) => Promise<void> | void;
// @ts-ignore
Router.useRouter = jest.fn(() => ({
push: push,
}));
const mockData = { email: "test@test.com", password: "test@1234" };
// @ts-ignore
ReactQuery.useMutation = jest.fn(
(
key: MutationKey,
mutationFunction: MutationFunction,
options: MutateOptions<
AxiosResponse<LoginResponse>,
AxiosError,
LoginValidationValues
>
) => {
console.log(options.onError.arguments);
onError = options.onError;
return {
mutate: jest.fn(() => mockData),
isLoading: false,
};
}
);
const { result, rerender } = renderHook(() =>
useRedirectOnErrorMutation("/auth/admin/login", "key", adminLoginAPI)
);
rerender();
act(() => {
onError({}, {}, {});
});
expect(result.current.mutate(mockData)).toEqual(mockData);
expect(push).toHaveBeenCalled();
});
});
});
现在,这里测试的问题是,每次我运行它时,它仍然会显示未发现的onError部件,以及一条错误消息,说明error.response没有定义。我不知道如何在测试中通过onError参数。
那是(错误)
onError: (error) => {
if (error?.response.status == "401" || error?.response.status == "422") {
localStorage.removeItem("token");
localStorage.removeItem("userId");
router.push(redirectionPath);
}
理想情况下,在由act包装的测试中传递错误对象应该是有效的,但它最终也会产生错误消息,onError不是函数。
act(()=>{
onError({response:{status: 401}},{},{})
})
任何帮助都将不胜感激!我完全被困在这里了。
发布于 2021-04-15 15:35:02
我真的不能给你一个具体的答案,也许只是给你一点建议:
onError
方法,这是react-query
内部测试的内容。不要测试第三方代码-测试自己的代码。像这样的东西用集成或端到端测试测试要好得多,柏树是一个很好的工具。发布于 2021-08-08 02:05:52
解决方案是在测试中创建查询客户端时关闭react重试,否则retries查询将等待下一次重试失败(默认值:3次),并且可能会超时。https://github.com/tannerlinsley/react-query/discussions/2196#discussioncomment-659468
https://stackoverflow.com/questions/67090742
复制相似问题