我正在尝试为引发特定错误的函数创建一个模拟:
throwCycleDetected(ticket: string): never {
throw new HttpException ()
}
但是,当我尝试用玩笑来模拟该函数时:
throwerGuard.throwCycleDetected = jest
.fn()
.mockImplementation(() => {
throw new Error('Detected a cycle of tickets for ticketId')
})
我收到错误:
Type 'Mock<any, any, any>' is not assignable to type '(ticketId: string) => never'. Type 'any' is not assignable to type 'never'.ts(2322)
你能帮我弄清楚我应该如何在不删除类型符号的情况下模拟这样的函数吗?
我从函数中删除了类型表示法,它允许模拟工作,但我真的不明白为什么有必要删除它,我更喜欢一个允许我在函数上保留类型表示法的解决方案。
never
类型非常棘手。我建议使用 jest.spyOn
来模拟该函数。
jest.spyOn(throwerGuard, "throwCycleDetected").mockImplementation(() => {
throw new Error("Detected a cycle of tickets for ticketId");
});
这样,您就不会通过直接赋值干扰方法,并保留
never
类型,不会出现任何问题。
如果您想保留直接分配,那么您必须执行以下操作:
// Using `unknown` as an intermediary type to satisfy TypeScript
throwerGuard.throwCycleDetected = jest.fn().mockImplementation(() => {
throw new Error("Detected a cycle of tickets for ticketId");
}) as unknown as (ticketId: string) => never;
您需要显式键入该函数,但需要进行中间
unknown
转换。输入 as (ticketId: string) => never;
会产生另一个打字稿错误,该错误指出any 无法转换为never。