【发布时间】:2020-10-16 17:42:41
【问题描述】:
我尝试在 Jest 中模拟一个异步函数,我使用了文档中所示的 mockResolvedValue。但是我遇到了只读问题,我的模拟函数是从其他地方导入的,我的代码如下:
//index.js
async function getUser(id) {
const user = await axios.get('./user')
return user
}
module.exports = {
getUser
}
//index.spec.js
import { getUser } from './index.js';
it('test getUser', async () => {
const expectedUser = [
{
id: '1',
name: 'Alice',
},
];
getUser = jest.fn().mockResolvedValue(expectedResult); //error of getUser is read-only
const result = await getUser();
expect(result).toEqual(expectedResult);
})
【问题讨论】:
-
那个测试似乎毫无意义,你似乎在试图模拟你应该测试的东西,所以你最终会测试模拟。你也没有
jest.mock任何东西,你应该看看例如jestjs.io/docs/en/manual-mocks.html. -
我正在尝试测试 getUser 函数,对吗?但我不想直接打服务器,这是我的目标。
-
那么你需要模拟
axios,而不是整个getUser。您也可以查看例如jest-mock-axios。但是 Axios 是一个你不拥有的接口,所以最好不要模拟它 - 考虑在它周围有一个外观,将你的代码与对 Axios 的更改隔离,然后模拟外观。或者,如果您有更高级别(例如端到端)的测试来告诉您请求是否停止工作,则可能根本不测试getUser。 -
我有这个代码:
async function getUser() { //what if there's multiple calls here? return something }我不应该测试 getUser 的结果吗? axios 只是我用来从 api 获取结果的库。我现在真的很困惑我该怎么办.. -
如果
getUser比您所展示的更复杂,那么它可能应该进行测试,您可以模拟 axios 或提取 axios 周围的外观并模拟它(因为,正如你所说,“axios 只是我使用的一个库” - 你不拥有它,以后可能想更改它)。我们无法为您做出这样的判断。
标签: javascript node.js axios jestjs