0

我不知道为什么,但测试失败了Expected mock function to have been called.。我应该如何设置addFundingSource模拟来调用它?我不能jest.mock像其他模块一样使用整个模块(例如jest.mock('../../../../_helpers/alerts');),因为其余功能也从该模块中使用。

fetchFundingSource.js

export const addFundingSource = () => {
  ...
}

export const fetchFundingSource = (history, onNewPaymentClose) => {
  let config = {
    ....
  };

  return async (dispatch) => {
  dispatch(fetchFundingSourceRequest());

  try {
    const response = await fetch(fundingSourceEndpoint, config);
    const jsonResponse = await response.json();
    if (!response.ok) {
      showErrorAlert(jsonResponse);
      dispatch(fetchFundingSourceError(jsonResponse));

      throw new Error(response.statusText);
    }

    dispatch(fetchFundingSourceSuccess(jsonResponse.count, jsonResponse.results));
    addFoundingSource(jsonResponse.results, history, onNewPaymentClose);
  } catch (error) {
    if (process.env.NODE_ENV === 'development') {
      console.log('Request failed', error);
    }
  }
};

测试

import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import * as fundingSource from '../../../../dashboard/global/ducks/fetchFundingSource';
import { fundingSourceEndpoint } from '../../../../_api/companyHelpers';
import { createMemoryHistory } from 'history';

jest.mock('../../../../_api/companyHelpers');
jest.mock('../../../../_helpers/alerts');
jest.mock('../../../../_api/authHelpers');

const middlewares = [thunk];
const createMockStore = configureMockStore(middlewares);

describe('fetchFundingSource', () => {
  beforeEach(() => { fetch.resetMocks(); });
  const history = createMemoryHistory('/dashboard');
  const onNewPaymentClose = {};
  fundingSource.addFundingSource = jest.fn(); //Mock setup.

  it('dispatches the correct actions on successful fetch request', () => {
    const store = createMockStore({});
    fetch.mockResponse(JSON.stringify({ count, results }));

    const expectedActions = [
      fetchFundingSourceRequestObject,
      fetchFundingSourceSuccessObject
    ];

    return store.dispatch(fundingSource.fetchFundingSource(history, onNewPaymentClose))
      .then(() => {
        expect(fundingSource.addFundingSource).toBeCalled(); //THIS FAILS
        expect(store.getActions()).toEqual(expectedActions);
      });
  });
});
4

1 回答 1

0

在您的示例中,我看不到命名导出addFundingSource的实际模拟位置。您可以像这样拦截和模拟导出:

import * as fundingSourceReduce from '../fetchFundingSource';
fundingSourceReduce.addFundingSource = jest.fn();

更多例子在这里

请注意,为了确保以正确的时间设置模拟,应将它们声明为beforeEach或直接声明为测试it调用。

于 2017-11-27T16:39:15.783 回答