Jest/Typescript:包含Jest和Typescript中私有成员的模拟类依赖项



上下文:我有一个依赖于类A的类B。我想测试类B的一个方法,该方法在内部调用类A的方法。现在,我想通过模拟类A来单元测试我的类B的方法。

注意1A类有一些私人成员

注意2A类没有接口

这是我的代码结构:


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

到目前为止我尝试过的:

在接受了我之前SO帖子中的建议后,我试着写下这样的测试:


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

Typescript给我这个错误:

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>; }'

我在之前的SO帖子中尝试过这个答案,但在与私人成员一起上课的情况下,它不起作用。

一些注意事项:

注意1A类包含私人成员

注意2A类没有接口

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

有一些命中&尝试并帮助这个github回购,我能够解决这个问题。

这是供参考的代码:

ClassBToTest功能测试:


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

最新更新