gpt4 book ai didi

javascript - Jest mockImplementation(Promise.resolve) 在监视从另一个类 (Node.js) 调用的对象时返回未定义

转载 作者:行者123 更新时间:2023-12-05 01:30:11 26 4
gpt4 key购买 nike

我无法让 Jest mockImplementation 在特定上下文中使用 Promise.resolve() 返回数据。

在我的 Node.js 代码中,我有一个结构,将所有 API 调用代码放在一个类 (Api) 中,将所有业务逻辑放在另一个类 (Repo) 中。当您实例化 Repo 时,它会为自己创建一个 Api 类的实例:this.api = new Api()

我正在尝试在 Repo 级别测试一个函数,并模拟 Api 调用,这样我们实际上不会在测试期间进行任何查询。

  const data = { postId: 3, id: 3, name: 'Bob Your Uncle' };
beforeEach(() => {
getSpy = jest.spyOn(repo.api, 'getPage').mockImplementation(() => {
Promise.resolve(data);
});
});

当我执行该函数时,expect(getSpy).toHaveBeenCalledTimes(1) 返回 true,但它返回的值是“未定义”,而不是预期的 promise 已解决。

当我实际运行代码时,它工作正常,但测试失败。我怀疑问题可能与我正在测试的代码正在调用第二个用户编写的类这一事实有关,我不确定。我发现了这个问题 Jest: Spy on object method?这似乎是相关的,但他们的解决方案(将 .prototype 添加到 spyOn 参数)对我没有帮助——他们使用的是原生 JS 对象而不是用户定义的对象,这似乎足以解释差异。

这是完整的 describe block :

describe('Repo: fetchRand', () => {
const data = { postId: 3, id: 3, name: 'Bob Your Uncle' };
beforeEach(() => {
getSpy = jest.spyOn(repo.api, 'getPage').mockImplementation(() => {
Promise.resolve(data);
});
});
afterEach(() => {
jest.clearAllMocks();
});
it('should fetch call this.api.getPage once', async () => {
let res = await repo.fetchRand();
expect(getSpy).toHaveBeenCalledTimes(1);
});
it('should return an object with a postId and an name', async () => {
let res = await repo.fetchRand();
expect(res).toHaveProperty('postId');
expect(res).toHaveProperty('name');
});
});

和正在测试的模块:

const Api = require('./Api');

module.exports = class Repository {
constructor() {
this.api = new Api();
}
async fetchRand() {
let id = this.getRandomInt(5);
let res = await this.api.getPage(id);
return res;
}
getRandomInt(max) {
return Math.floor(Math.random() * max) + 1;
}
};

还有指向 a GitHub repo with the full code 的链接-- 运行 npm test --Repo.test.js 来重现问题。 (这不是我的真实项目,只是复制问题基本性质的最简单的完整代码。)

最佳答案

该问题特定于 JavaScript 箭头语法而非 Jest。 getPage spy 不返回 promise ,因此它返回 undefined

应该使用不带括号的隐式返回:

.mockImplementation(() => (
Promise.resolve(data);
));

或显式返回:

.mockImplementation(() => {
return Promise.resolve(data);
});

返回 promise 的 spy 实现的捷径是:

.mockResolvedValue(data);

关于javascript - Jest mockImplementation(Promise.resolve) 在监视从另一个类 (Node.js) 调用的对象时返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67321204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com