【发布时间】:2021-07-09 10:39:52
【问题描述】:
我正在尝试模拟 useMutation,它有一个名为 onError 的参数。我正在使用它,如下面的代码所示。
每当使用 useRedirectOnErrorMutation 时,带有令牌的标头都会附加到请求中,因此如果令牌无效,则会出现 401 错误响应,我将在 useMutation 附带的 onError 函数中捕获该响应并将用户重定向到登录页面。
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 is not a function。
act(()=>{
onError({response:{status: 401}},{},{})
})
任何帮助将不胜感激!我完全被困在这里了。
【问题讨论】:
-
请重新表述您的问题。什么工作,什么不工作?它表现如何,您希望它表现如何?
-
我已经做出了改变!我希望这能提供更多的见解。对于给您带来的不便,我深表歉意。
标签: typescript testing jestjs react-testing-library react-query