【问题标题】:Jest pass a mocked class to a constructor开玩笑将模拟类传递给构造函数
【发布时间】:2020-05-04 16:12:52
【问题描述】:

假设我有

class A {
  constructor(classB) {

  }
}

class B {

}

如何在我的测试中实例化class A,并将模拟的class B 传递给它?基本上我想做的

a = new A(mockedClassB);

具体来说,我的问题是关于如何创建 mockedClassB 以便我可以将其传递给 A 构造函数。

【问题讨论】:

  • new A(mockedClassB) 有什么问题?
  • 或者你在问如何创建一个模拟类是in jest
  • @BenjaminGruenbaum 我在问如何创建mockedClassB :)

标签: javascript unit-testing mocking jestjs


【解决方案1】:

这里有一个解决方案:

a.js:

export default class A {
  classB;
  constructor(classB) {
    this.classB = classB;
  }

  getName() {
    return this.classB.getName();
  }
}

b.js:

export default class B {
  getName() {
    return 'real name from b';
  }

  // add a new method later
  getAge() {
    return 23;
  }
}

a.test.js:

import A from './a';
import B from './b';
jest.mock('./b');

describe('61596704', () => {
  it('should pass', () => {
    const mockedClassBInstance = new B();
    mockedClassBInstance.getName.mockReturnValueOnce('mocked name from b');
    const a = new A(mockedClassBInstance);
    const actual = a.getName();
    expect(actual).toEqual('mocked name from b');
  });

  it('getAge method of B should be mocked as well', () => {
    const mockedClassBInstance = new B();
    jest.isMockFunction(mockedClassBInstance.getAge);
  });
});

单元测试结果:

 PASS  stackoverflow/61596704/a.test.js (8.913s)
  61596704
    ✓ should pass (3ms)
    ✓ getAge method of B should be mocked as well (1ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        10.486s

【讨论】:

  • 是的,这是个问题。一旦我向 B 类添加了一个新方法,我需要回来更新这个测试调用。我希望有与 Java 的 Mockito 等效的东西,这样我就可以模拟整个类,而不是单独模拟每个方法
  • @Kousha 更新答案,您可以使用jest.mock()jest.doMock() 模拟类的所有方法
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 2020-07-09
  • 1970-01-01
  • 2023-02-15
  • 2018-05-03
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
相关资源
最近更新 更多