Я понятия не имею, как издеваться над возвращаемым значением внутренней функции внутри шутки. Я пробовал разные подходы. Наконец-то я нашел этот отвечать но значение почему-то не издевательское, вот пример:
страны.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' }));
страны.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.info('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
});
});
Пожалуйста, предложите мне любые возможные решения, почему внутренняя тестовая функция игнорирует возвращаемое значение для внутренней функции. Настройка из приложения Create React.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вопрос, на который вы ссылаетесь, имеет в настоящее время принятый ответ, который не работает. Я добавил новый ответ с объяснением и рабочим примером.
Здесь применяется та же концепция: макет заменяет экспорт модуля функции, поэтому, чтобы иметь возможность имитировать countriesList внутри getSortedCountryData, вы должны вызвать экспорт модуля для countriesList.
Один из вариантов — переместить countriesList в отдельный модуль.
Другой вариант — воспользоваться тем фактом, что «Модули ES6 автоматически поддерживают циклические зависимости», поэтому вполне допустимо import модуль в себя, чтобы вы могли вызывать экспорт модуля для countriesList:
страны.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' }));
страны.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();
});
});
Использование циклического импорта больше похоже на хак, но спасибо, это было очень полезно для меня, я думал разделить на разные файлы, но меня остановило то, что это немного не очень хорошее решение для разделения на разные файлы одной логически связанной функциональности. .