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 分配给一个只有一个下划线的实例变量,然后在一个有两个下划线的实例变量上调用该方法。
我有 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 但没有任何效果。
更新:感谢
鉴于 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 分配给一个只有一个下划线的实例变量,然后在一个有两个下划线的实例变量上调用该方法。