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 类的对象。我只是想嘲笑班级。
我还发现了一些以前的帖子:Post1和Post2,但没有任何效果。
更新:由于下面詹姆斯的回答,这个问题得到了解决。对于带有私人成员的模拟类,我问了另一个SO Question。请务必阅读。
Jam*_*nne 17
鉴于 Typescript 是结构类型的,应该可以简单地构造一个与 A 类的接口匹配的对象,并将其传递给 B 类。
\n例如:
\nconst mockA: jest.Mocked<A> = {\n getSomething: jest.fn()\n};\n\nconst b = new B(mockA);\n\nexpect(mockA.getSomething)\n .toHaveBeenCalled();\nRun Code Online (Sandbox Code Playgroud)\n鉴于mockA与类A的接口完全匹配,这不应该生成类型错误。
\n要模拟 A\xe2\x80\x99s 方法的返回值,请参阅使用 Jest 模拟单个函数。
\n事实证明,这比尝试模拟整个模块更简单、更简洁。由于您\xe2\x80\x99已使用IoC作为模式,因此没有必要模拟该模块。
\n你也有一个错字。B 类分配给仅包含一个下划线的实例变量,但随后调用包含两个下划线的实例变量上的方法。
\n| 归档时间: |
|
| 查看次数: |
19796 次 |
| 最近记录: |