Typescript 用参数模拟和测试误差

Typescript 用参数模拟和测试误差,typescript,testing,jestjs,react-testing-library,react-query,Typescript,Testing,Jestjs,React Testing Library,React Query,我试图模拟UseOtation,它有一个特定的参数,名为onError。我正在使用它,如下面的代码所示 无论何时使用UsereDirectorRorMutation,都会将带有令牌的头附加到请求,因此如果令牌无效,将出现401错误响应,我将在useMutation附带的onError函数中捕获该响应,并将用户重定向到登录页面 export const useRedirectOnErrorMutation = < TData = unknown, TError = unkno

我试图模拟UseOtation,它有一个特定的参数,名为onError。我正在使用它,如下面的代码所示

无论何时使用UsereDirectorRorMutation,都会将带有令牌的头附加到请求,因此如果令牌无效,将出现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);
            }
        },
    });
};
理想情况下,在act包装的测试中传递一个错误对象应该是可行的,但它也会以错误消息结束

act(()=>{
  onError({response:{status: 401}},{},{})
})

任何帮助都将不胜感激!我完全被困在这里。

我真的不能给你一个具体的答案,也许只是一点建议:

  • 需要100%测试覆盖率的目的是什么?您尝试测试的函数有很多副作用,您必须模拟请求、本地存储、react路由器、onError等等。。。剩下的基本上是测试代码,而不是实际的生产代码。您基本上是在测试react query是否调用
    onError
    方法,这是
    react query
    内部测试的内容。不要测试第三方代码-测试您自己的代码。这样的东西可以通过集成或端到端测试进行更好的测试,这是一个很好的工具

  • 如果您想测试定制钩子,我只会模拟queryFn的结果,而不是整个变异函数。这一点很好——甚至有一个例子说明了如何在中实现这一点。是在网络级别模拟请求的一个很好的工具,我最近写了一篇关于使用mock service worker测试react查询的文章,如果您想阅读它的话。它还链接到一个带有工作测试的示例回购


  • 请重新措辞你的问题。什么有效,什么无效?它的表现如何,你希望它表现如何?我已经做了改变!我希望这能提供更多的见解。对于给您带来的不便,我深表歉意。但是,我如何确定当遇到错误时,页面将从测试角度重定向?另外,我需要100%的覆盖率,因为如果测试不超过95%,我们的管道就会失败。关键是,它鼓励我们保持代码质量并处理边缘情况。另外,假设当我模拟API响应并发送401错误时,将执行onError部分,并且它不会有用于检查状态的error对象。
    onError: (error) => {
                    if (error?.response.status == "401" || error?.response.status == "422") {
                        localStorage.removeItem("token");
                        localStorage.removeItem("userId");
                        router.push(redirectionPath);
                    }
    
    act(()=>{
      onError({response:{status: 401}},{},{})
    })