我想强力地开玩笑。在某种程度上,我可以使它工作,但是当一个类具有私有属性时,我就被困住了。
另一个问题,当我使用模拟(当前使用的方式)时,返回类型为原始类型,但是当我必须访问Jest添加的任何方法时,我必须进行类型转换,以便jest.Mock
进行访问一个方法。有一个更好的方法吗?我尝试使用jest.Mock
,jest.Mocked
,jest.MockInstance
。
如果有人能指出我正确的方向,那就太好了!
class MyTest {
constructor(private readonly msg: string) {}
public foo(): string {
return this.msg;
}
}
const myTestMock: jest.Mock<MyTest, [string]> = jest.fn<MyTest, [string]>(() => ({
msg: 'private',
foo: jest.fn().mockReturnValue('aaa'),
}));
// Results in error:
// Type '{ msg: string; foo: Mock<any, any>; }' is not assignable to type 'MyTest'.
// Property 'msg' is private in type 'MyTest' but not in type '{ msg: string; foo: Mock<any, any>; }'
const myTestMockInstance: MyTest = new myTestMock('a');
console.log(myTestMockInstance.foo()); // --> aaa
// Accessing jest mock methods:
(<jest.Mock>myTestMockInstance).mockClear(); // <-- can this be done without type casting
肮脏的解决方法:
const myTestMock: jest.Mock<MyTest, [string]> = jest.fn<MyTest, [string]>(
// Cast to any to satisfy TS
(): any => ({
msg: 'private',
foo: jest.fn().mockReturnValue('aaa'),
})
);
答案 0 :(得分:1)
有一个创建类型的助手:外观ts-jest
通常,您应该测试公共接口,而不是实现。无需测试私有方法,您可以将该逻辑提取到公共接口(也许提取到提供该接口的另一个类)
答案 1 :(得分:1)
有一个库可以帮助您使用 Jest 在 Typescript 中进行强类型模拟:jest-mock-extended
我不确定您是否应该访问模拟的私有属性。正如 Kim Kern 所说,您应该只对被测单元的依赖项的公共接口感兴趣。
jest-mock-extended 包含一个 mock()
方法,该方法返回一个 MockProxy
,允许您访问 .mockReturnValue()
等。
import { mock } from "jest-mock-extended";
interface WidgetService {
listMyWidgets(): { id: string }[];
};
const mockedService = mock<WidgetService>();
mockedService.listMyWidgets.mockReturnValue([{ id: 'widget-1' }]);