使用玩笑模拟时出现打字稿错误

新手上路,请多包涵

我有一个以前创建的 .js 文件,它模拟了我们的一些函数,用于 jest 测试目的。我正在将其迁移到 .ts 文件:

服务器.ts

 const Server = jest.genMockFromModule('../Server');

Server.getAsync = Server.default.getAsync;
// other REST-ful functions here

export default Server;

我收到以下错误:

类型“{}”上不存在属性“getAsync”

类型“{}”上不存在属性“默认”

然后,在相应的测试文件中:

我的组件.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[]) => any): jest.Mock<{}>

…在 Server.getAsync.mockReturnValueOnce

类型“(url: string, baseRoute?: string | null, loadingGenerator?: (isLoading: boolean) => { type: strin…”上不存在属性“mockReturnValueOnce”。

…以及 Server.getAsync.mock

属性“mock”在类型“(url: string, baseRoute?: string | null, loadingGenerator?: (isLoading: boolean) => { type: strin…”上不存在。

我已经为此苦苦思索了一段时间,所以非常感谢任何帮助。

更新

好的,我将 as any 添加到我的 Server.ts 文件第一行的末尾,现在它看起来像:

 const Server = jest.genMockFromModule('../Server') as any;

这摆脱了第一组错误。仍然面临我的 .test.ts 文件中的错误。

更新 2

我注意到,当我运行实际的笑话测试时,即使存在类型错误,它们也会全部通过。这些问题似乎与实际测试无关。

原文由 noblerare 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 331
2 个回答

我自己解决了这个问题。我让它工作的方法是 Server.getAsync 的任何调用转换为特定的笑话模拟类型。

 let getAsyncMock = Server.getAsync as jest.Mock

或者

let getAsyncMock = <jest.Mock>(Server.getAsync)

这摆脱了我的错误。

原文由 noblerare 发布,翻译遵循 CC BY-SA 4.0 许可协议

在@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();
  });

});

原文由 iarroyo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题