web-dev-qa-db-ja.com

関数内のJestモック関数

私はさまざまなアプローチを試みたjest内の内部関数の戻り値をモックする方法がわかりません。最後に私はこれを見つけました answer ですが、何らかの理由で値をあざけっていません。ここに例があります:

countrys.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' }));

countrys.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アプリ。

リンクした質問には、現在受け入れられていない回答があり、機能しません。 新しい答え を説明と実際の例とともに追加しました。

ここでも同じ概念が適用されます。モックは、countriesListgetSortedCountryDatacountriesListモジュールexportを呼び出す必要があります。

1つのオプションは、countriesListを独自のモジュールに移動することです。

他のオプションは、 "ES6モジュールが循環依存関係を自動的にサポートする" という事実を利用することです。これにより、モジュールをimportに完全に有効にして、countriesListのモジュールエクスポート

countrys.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' }));

countrys.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();
  });
});
4
Brian Adams