Jest spyOn () вызывает актуальную функцию вместо поддельной - PullRequest
0 голосов
/ 13 сентября 2018

Я тестирую apiMiddleware, который вызывает вспомогательную функцию callApi.Чтобы предотвратить вызов фактического callApi, который вызовет вызов API, я издевался над этой функцией.Тем не менее, он все еще вызывается.

apiMiddleware.js

import axios from 'axios';

export const CALL_API = 'Call API';

export const callApi = (...arg) => {
  return axios(...arg)
    .then( /*handle success*/ )
    .catch( /*handle error*/ );
};

export default store => next => action => {
  // determine whether to execute this middleware
  const callAPI = action[CALL_API];
  if (typeof callAPI === 'undefined') {
    return next(action)
  }

  return callAPI(...callAPI)
    .then( /*handle success*/ )
    .catch( /*handle error*/ );
}

apiMiddleware.spec.js

import * as apiMiddleware from './apiMiddleware';

const { CALL_API, default: middleware, callApi } = apiMiddleware;

describe('Api Middleware', () => {

  const store = {getState: jest.fn()};
  const next = jest.fn();
  let action;

  beforeEach(() => {
    // clear the result of the previous calls
    next.mockClear();
    // action that trigger apiMiddleware
    action = {
      [CALL_API]: {
        // list of properties that change from test to test 
      }
    };
  });

  it('calls mocked version of `callApi', () => {
    const callApi = jest.spyOn(apiMiddleware, 'callApi').mockReturnValue(Promise.resolve());

    // error point: middleware() calls the actual `callApi()` 
    middleware(store)(next)(action);

    // assertion
  });
});

Пожалуйста, игнорируйте свойства действия и аргумент функции callApi.Я не думаю, что они беспокоятся о том, что я пытаюсь сделать.

Скажите, если вам нужна дополнительная проработка.

1 Ответ

0 голосов
/ 13 сентября 2018

Шутка работает только на импортированные функции.В вашей apiMiddleware.js функция default вызывает переменную callApi, а не "экспортированную" callApi функцию.Чтобы макет заработал, переместите callApi в его собственный модуль и import в apiMiddleware.js

Хороший вопрос!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...