Jest/Typescript: 在 Jest 和 Typescript 中模拟 class 依赖

Jest/Typescript: Mock class dependencies in Jest and Typescript

我有 class B 依赖于 class A。我想测试 class B 的方法,它在内部调用 class A 的方法. 现在,我想通过模拟 class A.

来对 class B 的方法进行单元测试

我的代码结构:

class A {
  getSomething() {
     return "Something";
  }
}


class B {
  constructor(objectOfClassA: A) {
      this._objectOfClassA = objectOfClassA;

 }

 functionofClassBToTest() {
     const returnValueFromClassA = this._objectOfClassA.getSomething();

     return returnValueFromClassA;
 }
}

到目前为止我尝试过的:

import ....
import { mocked } from 'jest-mock';

jest.mock("./A", () => {
    return {
        A: jest.fn().mockImplementation(() => {
            return {
                getSomething: getSomethingMock
            }
        })
    };
});

const getSomethingMock = jest.fn().mockImplementation(() => {
    return "Mock value";
});

const mockA = mocked(A, true);

test("test functionofClassBToTest", () => {
    const classBToTest = new B(mockA);

    expect(classBToTest.functionofClassBToTest.toStrictEqual("Mock value");
});


这是我遇到的错误:

TypeError: this._objectOfClassA.getSomething is not a function

注意:我不想在测试函数中初始化 class A 的对象。我只想嘲笑 class.

我还发现了一些以前关于 SO 的帖子:Post1 and Post2 但没有任何效果。

更新:感谢. For mocking classes with private members, I have asked another 解决了这个问题。请务必阅读。

鉴于 Typescript 是结构类型,应该可以简单地从字面上构造一个与 A class 的接口匹配的对象并将其传递给 classB.

例如:

const mockA: jest.Mocked<A> = {
  getSomething: jest.fn()
};

const b = new B(mockA);

expect(mockA.getSomething)
    .toHaveBeenCalled();

鉴于 mockA 与 class A 的接口完全匹配,这不应产生类型错误。

要模拟 A 方法的 return 值,请参阅使用 Jest 模拟各个函数。

事实证明,这比尝试模拟整个模块更简单、更简洁。由于您已将 IoC 用作模式,因此无需模拟模块。

你也有错别字。 Class B 分配给一个只有一个下划线的实例变量,然后在一个有两个下划线的实例变量上调用该方法。