笑话:如何模拟从index.js文件导出的自定义模块?

时间:2019-06-17 17:54:10

标签: javascript reactjs unit-testing jestjs react-testing-library

这是我的项目(create-react-app)的结构:

enter image description here

/src/api/searchAPI.js的内容:

import client from './client';

async function searchMulti(query, options = {}) {
  options.query = query;
  return await client.get('/search/multi', options);
}

export default {
  searchMulti
};

/src/api/index.js的内容:

import movieAPI from './movieAPI';
import personAPI from './personAPI';
import searchAPI from './searchAPI';
import configurationAPI from './configurationAPI';

export { movieAPI, personAPI, searchAPI, configurationAPI };

QuickSearch组件导入 searchAPI ,并使用它来通过网络获取一些数据。

现在,我需要测试(使用 react-testing-library )QuickSearch组件。

因此,我想模拟 api 模块(在/src/api/index.js中导出),以便使用模拟功能代替 searchAPI.searchMulti()< / em>。

如果我将下面的代码放在/src/componentns/__tests__/QuickSearch.js中,则效果很好:

...
import { searchAPI } from '../../
...
...
jest.mock('../../api', () => {
  return {
    searchAPI: {
      searchMulti: jest.fn().mockResolvedValue({ results: [] })
    }
  };
});

...

it('some test', () => {
  searchAPI.searchMulti.mockResolvedValueOnce({ results: [] });

  const { queryByTitle, getByPlaceholderText } = renderWithRouter(
    <QuickSearch />
  );

  const input = getByPlaceholderText(/Search for a movie or person/i);

  expect(searchAPI.searchMulti).not.toHaveBeenCalled();

  act(() => {
    fireEvent.change(input, { target: { value: 'Aladdin' } });
  });

  expect(searchAPI.searchMulti).toHaveBeenCalledTimes(1);
});

我的问题是我不想在每个需要它的测试文件中模拟 api 。相反,我想将 api 放在__mocks__文件夹中,以便其他测试也可以使用它。

我该怎么做?

0 个答案:

没有答案