Jest макет функции внутри функции - PullRequest
2 голосов
/ 15 марта 2019

Я понятия не имею, как смоделировать возвращаемое значение внутренней функции внутри jest. Я пробовал разные подходы.В конце концов я нашел этот ответ , но значение почему-то не насмешливо, вот пример:

country.js

export const countryList = () => [
      {
        label: '+244',
        value: 'Angola',
      }, // list of all possible countries very long...
 ];

export const getSortedCountryData = intlLang =>
  countriesList()
  .sort((compare, comparable) =>
    compare.value.localeCompare(comparable.value, intlLang, { sensitivity: 'base' }));

country.test.js

import * as countyListHelper from './countries';

describe('countries list', () => {
  test('returns list of countries', () => {
    const mockFn = jest.mock();

    const expectedList = [
      {
        label: '+244',
        value: 'Angola',
      },
      {
        label: '+43',
        value: 'Austria',
      },
    ];

    mockFn.spyOn(countyListHelper, 'countriesList').mockReturnValue(expectedList);

    // console.log('if return value mocked correctly',
    // countyListHelper.countriesList() === expectedList); // true
    expect(countyListHelper.getSortedCountryData('en')).toEqual(expectedList);
    // shows error with received value list of all countries instead of mocked one
  });
});

Пожалуйста, предложите мне возможные решения, по которым игнорируется возвращаемое значение внутренней функции тестовой функции для внутренней функции.Установка из приложения Создать React.

1 Ответ

1 голос
/ 16 марта 2019

На вопрос, на который вы ссылаетесь, в настоящее время принят ответ, который не работает. Я добавил новый ответ с пояснением и рабочим примером.

Та же концепция применима и здесь: макет заменяет модуль экспорта функции, чтобы иметь возможность смоделировать countriesList в getSortedCountryData, вы должны вызвать экспорт модуля для countriesList.

Один из вариантов - переместить countriesList в собственный модуль.

Другой вариант - воспользоваться тем фактом, что «Модули ES6 поддерживают циклические зависимости автоматически» , поэтому вполне допустимо import модуль в себя, чтобы вы могли вызвать Модуль экспорта для countriesList:

countries.js

import * as countyListHelper from './countries';

export const countriesList = () => [
  {
    label: '+244',
    value: 'Angola',
  }, // list of all possible countries very long...
];

export const getSortedCountryData = intlLang =>
  countyListHelper.countriesList()
    .sort((compare, comparable) =>
      compare.value.localeCompare(comparable.value, intlLang, { sensitivity: 'base' }));

countries.test.js

import * as countyListHelper from './countries';

describe('countries list', () => {
  test('returns list of countries', () => {

    const expectedList = [
      {
        label: '+244',
        value: 'Angola',
      },
      {
        label: '+43',
        value: 'Austria',
      },
    ];

    const spy = jest.spyOn(countyListHelper, 'countriesList');
    spy.mockReturnValue(expectedList);

    expect(countyListHelper.getSortedCountryData('en')).toEqual(expectedList);  // Success!

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