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



我有一个依赖于类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;
}
}

到目前为止我尝试过的:

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

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

我也在SO上找到了一些以前的帖子:Post1和Post2,但都没用。

更新:由于詹姆斯在下面的回答,这个问题得到了解决。对于与私人成员一起嘲笑课堂,我又问了一个SO问题。请务必阅读。

假设Typescript在结构上是类型的,那么应该可以简单地构造一个与A类接口匹配的对象,并将其传递到B类中。

例如:

const mockA: jest.Mocked<A> = {
getSomething: jest.fn()
};
const b = new B(mockA);
expect(mockA.getSomething)
.toHaveBeenCalled();

如果mockA与A类的接口完全匹配,这不应该产生类型错误。

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

事实证明,这比试图模拟整个模块更简单、更简洁。由于您已经使用IoC作为一种模式,因此没有必要嘲笑该模块。

你也有一个打字错误。类B分配给一个只有一个下划线的实例变量,但随后在一个有两个下划线的例子变量上调用该方法。

最新更新