当前位置: 首页 > 知识库问答 >
问题:

当窥探从另一个类调用的对象(Node.js)时,Jest mock实现(Promise.resolve)返回未定义

巫马松
2023-03-14

我很难得到一个Jest Mock实现来返回promise数据。在特定上下文中解析()。

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

我正在尝试在Repo级别测试一个函数,并模拟Api调用,以便在测试期间不进行任何查询。

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

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

当我在现实生活中运行代码时,它工作得很好,但是测试失败了。我怀疑这个问题可能与我正在测试的代码调用第二个用户编写的类有关,我不确定。我发现这个问题笑话:间谍对象方法?这似乎是相关的,但是他们的解决方案(在spyOn参数中添加了。原型)对我没有帮助——他们使用的是本地JS对象,而不是用户定义的对象,这似乎不同于解释这种差异。

下面是完整的描述块:

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;
  }
};

并链接到GitHub回购,其中包含完整的代码运行npm test-Repo.test.js来复制问题。(这不是我真正的项目,只是最简单的完整代码来复制问题的基本性质。)

共有2个答案

有宏邈
2023-03-14

这个问题是特定于JavaScript箭头语法的,而不是玩笑getPagespy不返回promise,因此它返回undefined

它应该是使用没有括号的隐含返回:

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

或显式返回:

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

返回promise的spy实现的快捷方式是:

.mockResolvedValue(data);
东方淇
2023-03-14

埃斯特斯·弗拉克的评论让我找到了书面答案。我想,这与一流企业中的一流企业毫无关系,只是使用了错误的模拟。

这一变化奏效了:

getSpy = jest.spyOn(repo.api, 'getPage').mockResolvedValue(data);
 类似资料:
  • 我有一个微不足道的问题,但由于某种原因我无法解决。 我有一个对象,它是来自API的返回请求: 和: 第一部分是在react组件之前首先出现的内容。我能够获取一个对象,然后创建一个返回另一个对象的变量(const),在本例中: 对于我的无知,奇怪的部分是,如果我试图以这种方式访问第一个值(feels_like): 它将抛出一个错误,即无法读取未定义的属性feels_like。 现在,我试图循环遍历对

  • 问题内容: 我正在尝试序列化以序列化下面包含的json字符串。 我正在使用此gson调用对其进行序列化 我的班主任就是这样。 对于任何其他类变量,它都是这样。当我尝试使用上述调用时,最终会得到具有所有空值的对象。要注意的一件事是json字符串中未提供某些字段,因为不同的api调用提供了这些json字符串的不同部分。我做错了什么? 问题答案: 您提供的JSON根对象具有属性-因此,您有两个选项可以使

  • 我实现了一个函数,希望返回保存在某个url下的对象。在下面的代码中,第一个“console.log(result);”从firebase位置返回正确的对象。第二个返回未定义。有人能解释一下为什么以及如何修复它吗?

  • 本文向大家介绍Python面向对象实现一个对象调用另一个对象操作示例,包括了Python面向对象实现一个对象调用另一个对象操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python面向对象实现一个对象调用另一个对象操作。分享给大家供大家参考,具体如下: 我先总结一下python中的类的特点: 1.类中所有的方法的参数中都必须加self,并且是第一个参数 2.__init__方法用

  • 我有像下面这样的课。 我通过Restendpoint获取此对象。问题是,当字段passPayer和driver对象相等时,在返回的JSON中,driver字段只包含ID(它只是一个整数值),passPayer字段包含所有对象字段。 当这些字段具有不同的对象时,两个字段都显示如下所示的完整详细信息。 我需要两个对象都包含数据(字段。[id,firstName,lastName,idNo]),无论它们

  • 问题内容: 我正在尝试使用Flask和请求构建一个简单的代理。代码如下: 除丢失了Elasticsearch的状态代码外,此方法有效。我尝试直接返回(a ),但这失败了 还有另一种简单的从Flask返回a的方法吗? 问题答案: 好的,找到它: 如果返回一个元组,则该元组中的项目可以提供额外的信息。这样的元组必须采用格式(响应,状态,标题)。状态值将覆盖状态代码,并且标头可以是其他标头值的列表或字典