首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ES6类玩笑

ES6类玩笑
EN

Stack Overflow用户
提问于 2018-09-10 17:48:49
回答 2查看 1.3K关注 0票数 1

我有一个ES6类,我需要它来模拟它的方法。在文档之后,我对此进行了手动模拟,并获得了要调用和断言的构造函数。

我使用这个类的函数只是一个基本函数,它运行一个类方法。

test.js

代码语言:javascript
复制
const mockConnect = jest.fn();
const mockAccess = jest.fn();
jest.mock('../../src/connection');
const connection = require('../../src/connection').default;

connection.mockImplementation(() => {
  return {
    connect: mockConnect,
    access: mockAccess.mockReturnValue(true),
  };
});

caller_function(); 
expect(connection).toHaveBeenCalled(); // works properly as the constructor is called
expect(connection).toHaveBeenCalledWith('something'); // works
expect(mockAccess).toHaveBeenCalled(); // says it was not called when it should have

caller_function.js

代码语言:javascript
复制
import connection from 'connection';
const conn = new connection('something');

export function caller_function() {
  conn.access(); // returns undefined when mock says it should return true
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-11 01:59:37

之所以会发生这种情况,是因为您使用的是mockImplementation(),而不是jest.mock()的手动模拟或工厂参数,而且模拟对象是在模块加载过程中创建的,因为构造函数调用不在任何函数中。正在发生的事情是:

  1. jest.mock('../../src/connection')的调用运行并将connection设置为自动模拟。
  2. conn对象是使用自动模拟创建的。因此,它的access方法返回未定义的。
  3. 发生了对mockImplementation()的调用,更改了connection模拟。但是,由于已经创建了conn对象,所以它无法获得自定义实现。

将构造函数调用移动到caller_function是修复它的一种方法:

代码语言:javascript
复制
export function caller_function() {
  const conn = new connection('something');
  conn.access();
}

您还可以使用工厂参数来jest.mock(),指定那里的实现,而不是调用mockImplementation()。这样,您就不必更改实现代码:

代码语言:javascript
复制
const mockConnect = jest.fn();
const mockAccess = jest.fn();
import connection from '../../src/connection';
jest.mock('./so-import', () => {
  return jest.fn().mockImplementation(() => {
    return {
      connect: mockConnect,
      access: mockAccess.mockReturnValue(true)
    };
  });
});

...

顺便说一句,ES6类名的惯例是以大写字母开头。我暂时被小写的名字connection弄糊涂了。

票数 1
EN

Stack Overflow用户

发布于 2018-09-10 18:00:04

在为方法编写connection.mockClear();之前,您尝试过执行mockImplementation吗?此外,请参阅此https://jestjs.io/docs/en/es6-class-mocks

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52263000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档