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

时间:2018-07-06 18:08:50

标签: javascript reactjs typescript unit-testing jestjs

我有一个先前创建的.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,它们也都通过了。这些问题似乎与实际测试无关。

5 个答案:

答案 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.mockReturnValueOnceServer.getAsync.mock,您实际上要使用mocked而不是像其他答案所建议的那样强制转换类型。

示例:mocked(Server.getAsync).mockReturnValueOnce()