Jest/Typescript: Mock class 依赖包含 jest 和 typescript 中的私有成员
Jest/Typescript: Mock class dependencies containing private members in jest and typescript
上下文:我有 class B 依赖于 class A。我想测试 class B 的方法,它在内部调用 [=67= 的方法] A. 现在,我想通过模拟 class A.
来对 class B 的方法进行单元测试
注1: Class A有一些私有成员
注2:ClassA没有接口
这是我的代码结构:
class Base {
someMethod() {
return "Hello ";
}
}
class A {
private _baseClassImpl: Base;
constructor(baseClassImpl: Base) {
this._baseClassImpl = baseClassImpl;
}
getSomething() {
return this._baseClassImpl.someMethod() + " Something";
}
}
class B {
constructor(objectOfClassA: A) {
this._objectOfClassA = objectOfClassA;
}
functionOfClassBToTest() {
const returnValueFromClassA = this._objectOfClassA.getSomething();
return returnValueFromClassA;
}
}
到目前为止我已经尝试过:
在采纳了 的建议后,我尝试编写如下测试:
const getSomethingMock = jest.fn().mockImplementation(() => {
return "Mock value";
});
const mockA = jest.Mocked<A> = {
getSomething: getSomethingMock
};
test("test functionOfClassBToTest", () => {
const classBToTest = new B(mockA);
expect(classBToTest.functionofClassBToTest.toStrictEqual("Hello Something");
});
上面的代码给我这个错误:
Type '{ getSomething: jest.Mock<any, any>; }' is not assignable is not assignable to type 'Mocked<A>'.
Type '{ getSomething: jest.Mock<any, any>; }' is missing the following properties from type 'A': _baseClassImpl
并且当我尝试像这样为 _baseClassImpl 提供模拟值时:
const baseClassMock = jest.Mocked<Base> = {
someMethod: jest.fn()
};
const getSomethingMock = jest.fn().mockImplementation(() => {
return "Mock value";
});
const mockA = jest.Mocked<A> = {
getSomething: getSomethingMock,
_baseClassImpl: baseClassMock
};
打字稿给我这个错误:
Type '{ getSomething: jest.Mock<any, any>; _baseClassImpl: jest.Mocked<Base>; }' is not assignable is not assignable to type 'Mocked<A>'.
Type '{ getSomething: jest.Mock<any, any>; _baseClassImpl: jest.Mocked<Base>; }' is not assignable is not assignable to type 'A'.
Property '_baseClassImpl' is private in type 'A' but not in type '{ getSomething: jest.Mock<any, any>; _baseClassImpl: jest.Mocked<Base>; }'
我已经在我的 上尝试了这个答案,但它在 class 与私人成员的情况下不起作用。
一些注意事项:
注1: Class A包含私有成员
注2:ClassA没有接口
注释 3: 我不想在我的测试函数中初始化 class A 的对象。我只想嘲笑 class.
在这个 github repo 的帮助下,我解决了这个问题。
参考代码如下:
测试 functionOfClassBToTest :
//Note: this can be also written as : const mockA = new (<any>A)() as jest.Mocked<A>;
const mockA = new (<new () => A>A)() as jest.Mocked<A>;
mockA.getSomething = jest.fn();
test("test functionOfClassBToTest", () => {
mockA.getSomething.mockReturnValueOnce("Hello Something");
const classBToTest = new B(mockA);
expect(classBToTest.functionofClassBToTest.toStrictEqual("Hello Something");
});
上下文:我有 class B 依赖于 class A。我想测试 class B 的方法,它在内部调用 [=67= 的方法] A. 现在,我想通过模拟 class A.
来对 class B 的方法进行单元测试注1: Class A有一些私有成员
注2:ClassA没有接口
这是我的代码结构:
class Base {
someMethod() {
return "Hello ";
}
}
class A {
private _baseClassImpl: Base;
constructor(baseClassImpl: Base) {
this._baseClassImpl = baseClassImpl;
}
getSomething() {
return this._baseClassImpl.someMethod() + " Something";
}
}
class B {
constructor(objectOfClassA: A) {
this._objectOfClassA = objectOfClassA;
}
functionOfClassBToTest() {
const returnValueFromClassA = this._objectOfClassA.getSomething();
return returnValueFromClassA;
}
}
到目前为止我已经尝试过:
在采纳了
const getSomethingMock = jest.fn().mockImplementation(() => {
return "Mock value";
});
const mockA = jest.Mocked<A> = {
getSomething: getSomethingMock
};
test("test functionOfClassBToTest", () => {
const classBToTest = new B(mockA);
expect(classBToTest.functionofClassBToTest.toStrictEqual("Hello Something");
});
上面的代码给我这个错误:
Type '{ getSomething: jest.Mock<any, any>; }' is not assignable is not assignable to type 'Mocked<A>'.
Type '{ getSomething: jest.Mock<any, any>; }' is missing the following properties from type 'A': _baseClassImpl
并且当我尝试像这样为 _baseClassImpl 提供模拟值时:
const baseClassMock = jest.Mocked<Base> = {
someMethod: jest.fn()
};
const getSomethingMock = jest.fn().mockImplementation(() => {
return "Mock value";
});
const mockA = jest.Mocked<A> = {
getSomething: getSomethingMock,
_baseClassImpl: baseClassMock
};
打字稿给我这个错误:
Type '{ getSomething: jest.Mock<any, any>; _baseClassImpl: jest.Mocked<Base>; }' is not assignable is not assignable to type 'Mocked<A>'.
Type '{ getSomething: jest.Mock<any, any>; _baseClassImpl: jest.Mocked<Base>; }' is not assignable is not assignable to type 'A'.
Property '_baseClassImpl' is private in type 'A' but not in type '{ getSomething: jest.Mock<any, any>; _baseClassImpl: jest.Mocked<Base>; }'
我已经在我的
一些注意事项:
注1: Class A包含私有成员
注2:ClassA没有接口
注释 3: 我不想在我的测试函数中初始化 class A 的对象。我只想嘲笑 class.
在这个 github repo 的帮助下,我解决了这个问题。
参考代码如下:
测试 functionOfClassBToTest :
//Note: this can be also written as : const mockA = new (<any>A)() as jest.Mocked<A>;
const mockA = new (<new () => A>A)() as jest.Mocked<A>;
mockA.getSomething = jest.fn();
test("test functionOfClassBToTest", () => {
mockA.getSomething.mockReturnValueOnce("Hello Something");
const classBToTest = new B(mockA);
expect(classBToTest.functionofClassBToTest.toStrictEqual("Hello Something");
});