Jest/Typescript:Jest 和 Typescript 中的模拟类依赖项

ani*_*ngh 16 javascript unit-testing typescript jestjs ts-jest

我有依赖于类 A 的类 B。我想测试类 B 的方法,该方法在内部调用类 A 的方法。现在,我想通过模拟类 A 对类 B 的方法进行单元测试。

我的代码结构:

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


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

 }

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

     return returnValueFromClassA;
 }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我已经尝试过:

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


Run Code Online (Sandbox Code Playgroud)

这是我收到的错误:

TypeError: this._objectOfClassA.getSomething is not a function

Run Code Online (Sandbox Code Playgroud)

注意:我不想在我的测试函数中初始化 A 类的对象。我只是想嘲笑班级。

我还发现了一些以前的帖子:Post1Post2,但没有任何效果。

更新:由于下面詹姆斯的回答,这个问题得到了解决。对于带有私人成员的模拟类,我问了另一个SO Question。请务必阅读。

Jam*_*nne 17

鉴于 Typescript 是结构类型的,应该可以简单地构造一个与 A 类的接口匹配的对象,并将其传递给 B 类。

\n

例如:

\n
const mockA: jest.Mocked<A> = {\n  getSomething: jest.fn()\n};\n\nconst b = new B(mockA);\n\nexpect(mockA.getSomething)\n    .toHaveBeenCalled();\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

要模拟 A\xe2\x80\x99s 方法的返回值,请参阅使用 Jest 模拟单个函数。

\n

事实证明,这比尝试模拟整个模块更简单、更简洁。由于您\xe2\x80\x99已使用IoC作为模式,因此没有必要模拟该模块。

\n

你也有一个错字。B 类分配给仅包含一个下划线的实例变量,但随后调用包含两个下划线的实例变量上的方法。

\n