TypeScript - Jest 的 mockResolvedValueOnce 方法中的实体出现“不可分配给类型从不”错误

作者:编程家 分类: typescript 时间:2025-12-17

使用TypeScript和Jest进行单元测试是开发者们常用的方式之一。Jest提供了一些强大的工具,例如mockResolvedValueOnce方法,用于在模拟异步函数时返回一个Promise对象。然而,有时候在使用mockResolvedValueOnce方法时,可能会遇到"不可分配给类型从不"的错误。本文将探讨这个错误的原因,并提供解决方案。

首先,让我们来看一个简单的示例代码,以便更好地理解这个错误。假设我们有一个名为UserService的类,其中包含一个异步方法getUserById,用于根据用户ID获取用户信息。我们希望在单元测试中模拟这个异步方法的返回值。

typescript

class UserService {

async getUserById(id: number): Promise {

// Some code to fetch user information

return "User";

}

}

为了模拟getUserById方法的返回值,我们可以使用Jest的mockResolvedValueOnce方法。我们希望返回一个Promise对象,该对象解析为字符串"User"。因此,我们可以编写如下的测试用例:

typescript

test("getUserById should return user information", async () => {

const userService = new UserService();

// Mock the getUserById method

userService.getUserById = jest.fn().mockResolvedValueOnce("User");

const user = await userService.getUserById(1);

expect(user).toBe("User");

});

在这个测试用例中,我们使用mockResolvedValueOnce方法来模拟getUserById方法的返回值。我们期望返回的是一个Promise对象,该对象解析为字符串"User"。然而,当我们尝试运行这个测试用例时,可能会遇到一个错误,错误消息为"不可分配给类型从不"。

## 错误原因

这个错误的原因是TypeScript无法正确推断mockResolvedValueOnce方法返回的Promise对象的类型。这是因为在这个例子中,我们将mockResolvedValueOnce方法返回的值设置为了一个字符串"User",而不是一个Promise对象。

## 解决方案

要解决这个错误,我们需要明确告诉TypeScript我们期望mockResolvedValueOnce方法返回的是一个Promise对象。我们可以使用as关键字来实现这一点。

typescript

test("getUserById should return user information", async () => {

const userService = new UserService();

// Mock the getUserById method

userService.getUserById = jest.fn().mockResolvedValueOnce("User" as unknown as Promise);

const user = await userService.getUserById(1);

expect(user).toBe("User");

});

在这个修改后的示例代码中,我们使用as关键字将字符串"User"转换为一个未知类型,然后再将其转换为Promise类型。这样,TypeScript就能正确推断mockResolvedValueOnce方法返回的Promise对象的类型了。

通过这种方式,我们可以解决"不可分配给类型从不"错误,使得我们的测试用例可以正常运行。

##

在使用TypeScript和Jest进行单元测试时,我们可能会遇到"不可分配给类型从不"错误。这个错误的原因是TypeScript无法正确推断Jest的mockResolvedValueOnce方法返回的Promise对象的类型。为了解决这个错误,我们需要明确告诉TypeScript我们期望mockResolvedValueOnce方法返回的是一个Promise对象。我们可以使用as关键字来实现这一点。通过这种方式,我们可以确保我们的测试用例能够正常运行,并且正确地模拟异步方法的返回值。

希望本文对你在使用TypeScript和Jest进行单元测试时遇到的问题有所帮助!