Как включить Intl в узле для тестов с использованием Jest? - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь протестировать функции форматирования валюты, и хотя они работают в браузере, они не работают в моей тестовой среде. Я понимаю, что intl не входит в стандартную комплектацию с узлом, поэтому я добавил intl и full-icu в мои devDependencies, но это не помогло

var IntlPolyfill = require('intl');
require('full-icu');
Intl.NumberFormat = IntlPolyfill.NumberFormat;
Intl.DateTimeFormat = IntlPolyfill.DateTimeFormat;

expect((4000).toLocaleString('fr-ca',{style: 'currency',currency: 'CAD',currencyDisplay: 'symbol'})).toBe('4 000,00 $')

/* test output: 
 Expected: "4 000,00 $"
 Received: "CA$ 4,000.00"
*/

В IE11, Chrome и Firefox я получаю ожидаемый результат ("14 337,00 $"), а в узле - нет.

Я нашел небольшую помощь онлайн, но нашел ссылку на 2 библиотеки, которые я использую здесь. Что мне нужно сделать, чтобы среда узлов, используемая Jest, имела доступ к соответствующим функциям Intl. Функция есть, но, похоже, она возвращает форматирование США для каждой локали.

1 Ответ

0 голосов
/ 18 июня 2019

Вы можете просто импортировать модуль узла intl в свой Jest-тест и передать его тестируемому JS:

import Intl from 'intl';
import CurrencyFormatter from '../../../js/modules/CurrencyFormatter.js';

describe('CurrencyFormatter', () => {
    let formatter = null;

    beforeEach(() => {
        formatter = new CurrencyFormatter(Intl);
    });

    test([...]);
});

И в вашем JS вы условно используете модуль intl , если он передан Jest:

export default class CurrencyFormatter {
    constructor(optionalIntl) {
        // Needed for Jest, because it doesn't support Intl natively:
        if (optionalIntl != null) {
            global.Intl = optionalIntl;
        }
        [...]
    }

    [...]
}

Таким образом вы убираете лишний модуль intl из своего производственного кода, делая его доступным для Jest только для тестов.

[Edit:] Как упомянул коллега, это действительно антишаблон - не адаптируйте свой производственный код, чтобы пройти тест. Тем не менее, есть лучший вариант, используя модуль узла full-icu, передавая его узлу в записи сценариев для jest, то есть сделайте что-то подобное в вашем package.json:

[...]
"scripts": {
    "test": "node --icu-data-dir=node_modules/full-icu node_modules/jest/bin/jest.js --version --config=./jest.config.js"
},
[...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...