我有一个先前创建的.js
文件,该文件嘲笑了我们的某些功能,用于jest
测试。我正在将其迁移到.ts
文件中:
Server.ts
const Server = jest.genMockFromModule('../Server');
Server.getAsync = Server.default.getAsync;
// other REST-ful functions here
export default Server;
我遇到以下错误:
类型'{}'不存在属性'getAsync'
类型“ {}”上不存在属性“默认”
然后,在相应的测试文件中:
MyComponent.test.ts
import Server from 'path/to/Server';
jest.mock('path/to/Server');
const dispatchMock = jest.fn();
const getStateMock = jest.fn();
describe('MyComponent.someFunction', () => {
beforeEach(() => {
jest.resetAllMocks();
});
it('Does the right stuff', () => {
Server.getAsync.mockReturnValueOnce(Promise.resolve([{ key: 'value' }]));
dispatchMock.mockImplementationOnce((promise) => promise);
dispatchMock.mockImplementationOnce();
return someFunction()(dispatchMock)
.then(() => {
expect(Server.getAsync).toHaveBeenCalledTimes(1);
expect(Server.getAsync.mock.calls[0][0]).toBe('something');
});
});
});
我在dispatchMock.mockImplementationOnce()
上遇到错误
期望1个参数,但得到0。(方法) jest.MockInstance <{}>。mockImplementationOnce(fn:(... args:any [])=> 任何):jest.Mock <{}>
...在Server.getAsync.mockReturnValueOnce
类型'(URL:字符串,不存在属性'mockReturnValueOnce' baseRoute ?:字符串| null,loadingGenerator ?:(isLoading:boolean)=> {type:strin ...'。
...以及Server.getAsync.mock
类型'((url:string,baseRoute ?: 字符串null,loadingGenerator ?:(isLoading:boolean)=> {类型: strin ...'。
我已经为此努力了一段时间,因此任何帮助将不胜感激。
更新
好的,我在as any
文件第一行的末尾添加了Server.ts
,现在看起来像这样:
const Server = jest.genMockFromModule('../Server') as any;
摆脱了第一组错误。虽然仍然遇到我的.test.ts
文件中的错误。
更新2
我注意到,当我运行实际的玩笑测试时,即使存在TypeError,它们也都通过了。这些问题似乎与实际测试无关。
答案 0 :(得分:9)
我自己解决了这个问题。我使用它的方法是将对Server.getAsync
的所有调用转换为特定的笑话模拟类型。
let getAsyncMock = Server.getAsync as jest.Mock
或
let getAsyncMock = <jest.Mock>(Server.getAsync)
这消除了我的错误。
答案 1 :(得分:2)
使用this
import { mocked } from 'ts-jest/utils';
import { foo } from './foo';
jest.mock('./foo');
expect(mocked(foo)).toHaveLength(1);
答案 2 :(得分:1)
在@nobleare响应之后...一个不错的更新是将模拟实现包装到beforeAll
中并将其清除到beforeEach
块中:
import { AnalyticsApi } from "../../api/src";
jest.mock("../../api/src");
describe('...', () => {
beforeAll(() => {
(AnalyticsApi as jest.Mock<AnalyticsApi>).mockImplementation(() => ({
listPolicies: jest.fn().mockResolvedValue('promiseValue')
}));
});
beforeEach(() => {
(AnalyticsApi as jest.Mock<AnalyticsApi>).mockClear();
});
});
答案 3 :(得分:0)
要覆盖导入,您可以这样操作:
import { AnalyticsApi } from "../../api/src";
jest.mock("../../api/src");
let listPolicies = jest.fn(() => {
return Promise.resolve();
});
(AnalyticsApi as jest.Mock<AnalyticsApi>).mockImplementation(() => ({
listPolicies,
}));
答案 4 :(得分:0)
首先,您正在使用genMockFromModule
来创建Server
的模拟,因此无需调用jest.mock('path/to/Server');
。
第二,您要通过Server.getAsync = Server.default.getAsync;
来实现什么?所有要做的就是将getAsync
提升到不必要的水平。您可以致电jest.genMockFromModule('../Server').default;
;
dispatchMock.mockImplementationOnce()
抛出该错误,因为您说要在此处将其传递给它一个承诺:dispatchMock.mockImplementationOnce((promise) => promise);
对于Server.getAsync.mockReturnValueOnce
和Server.getAsync.mock
,您实际上要使用mocked
而不是像其他答案所建议的那样强制转换类型。
示例:mocked(Server.getAsync).mockReturnValueOnce()