Как смоделировать переменную, импортированную в тестируемом модуле, и она не является параметром функции (сделайте это с описанием. Для каждого теста смените значение макета) - PullRequest
0 голосов
/ 25 января 2019

Мне нужно проверить функцию в моем TS-модуле.

module-to-test.ts

import { config } from './app-config';

export const isSomethingWhatINeedSelector = createSelector(
    firstDependencySelector,
    secondDependencySelector,
    (first, second) => config.key && (first || !second)
);

Но я не хочу писать много тестов для этого случая, и я хочу попробовать использовать describe.each([[],[],[]]) функциональность для уменьшения количества строк кода.

И мне нужно менять config.key на каждой итерации description.each. Когда я делаю в начале тестового файла что-то вроде этого:

jest.mock('./app-config', () => ({
    config: {
        key : false,
    },
}));

работает для всего файла и всех тестов. Я хочу сделать макет внутри функции "test / it" для динамического изменения значения ключа.

Теперь у меня есть этот код, который doesn't work, как и ожидалось

describe.each([
    [
        'should be ....',
        true, false
    ],
    [
        'should be ....',
        false, true
    ],
    /* and etc. ... [], [], [] ... only for questnion here is two params*/
])('Functionality of ...', (
    testTitle = '',
    mockStatusOfConfigKey,
    expected,
) => {
    const state = ... /* initial */

    beforeEach(() => {
        jest.resetModules();
        /*....configuring the state*/
    }); 

    it(testTitle, () => {
        jest.mock('./app-config', () => ({ /*...or doMock(), that don't works*/
           config: {
              key : mockStatusOfConfigKey,
           },
        }));
        expect(isSomethingWhatINeedSelector(state)).toBe(expected);
    });
    });

Есть идеи, как сделать макеты динамически изменяемыми внутри тестовых функций? config.key is just true/false

1 Ответ

0 голосов
/ 29 января 2019

Два важных понятия из Изучение ES6 (которые также применимы к Модулям TypeScript ):

В ES6 импорт - это оперативные представления только для чтения для экспортируемых значений

и

хотя вы не можете изменить значения импорта, вы можете изменить объекты, на которые они ссылаются.


app-config экспорт config , который является объектом .

config нельзя присвоить чему-либо еще, , но объект, на который он ссылается, можно изменить .

Любой код, который импортирует config, получает в реальном времени вид объекта и автоматически видит любые изменения объекта:

import { config } from './app-config';

...

  it(testTitle, () => {
    config.key = mockStatusOfConfigKey;  // modify the config object
    expect(isSomethingWhatINeedSelector(state)).toBe(expected); // SUCCESS
  });
});
...