Есть ли способ изменить смоделированное значение требуемой зависимости? - PullRequest
0 голосов
/ 06 июня 2019

Я столкнулся с проблемой, которую не могу решить самостоятельно, может быть, некоторые из вас сталкивались с той же проблемой.

Позвольте мне показать вам, что я пытаюсь сделать, вотmock:

let mockConfig = {name: 'dude'};
jest.mock('../../../configManager', () => mockConfig);

configManager - это зависимость функции, которую я пытаюсь протестировать.

Работает хорошо, но я хочу изменить возвращаемый объект configManagerв другом тесте, поэтому тестируемая функция ведет себя по-разному.

Позвольте мне показать вам, вот функция, которую я тестирую:

const config = require('../../../configManager');

module.exports = () => {
if (config.name === 'dude') {
  do stuff;
}

if (config.name === 'dudette') {
  do something else;
}

Итак, как правило, я хочу изменитьconfig.name для 'dudette' , чтобы иметь возможность проверить вторую часть моей функции.

Естественно, когда я хочу сделать это с импортированной функцией, я просто делаю:

let mockJsonQueryResult = { value: 'stuff' };
jest.mock('json-query', () => jest.fn(() => mockJsonQueryResult));

и затем в тесте я непосредственно устанавливаю другое значение mockJsonQueryResult:

mockJsonQueryResult = { value: 'hotterStuff' };

Но я не нахожу никакого способа сделать это с зависимостью, которая возвращает объект, с зависимостьюВозврат функции - без проблем.

Есть ли способ сделать это?

Заранее спасибо!

Редактировать: это не то же самое, что как изменить возвращаемое значение функции jest mock в каждом тесте? , как предложил @Dor Shinar, потому что его проблемачтобы смоделировать функцию, даже если она находится внутри возвращаемого объекта, она все еще является функцией, я просто хочу изменить значение внутри возвращаемого объекта.

Ответы [ 2 ]

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

Вам вообще не нужно издеваться над модулем.

Если экспорт модуля - это просто объект со значениями свойств, просто измените свойства по мере необходимости.

Вот простойрабочий пример для демонстрации:

configManager.js

module.exports = {
  name: 'original'
}

code.js

const config = require('./configManager');

module.exports = () => `name: ${config.name}`;

code.test.js

const config = require('./configManager');
const func = require('./code');

test('func', () => {
  expect(func()).toBe('name: original');  // Success!

  config.name = 'dude';
  expect(func()).toBe('name: dude');  // Success!

  config.name = 'dudette';
  expect(func()).toBe('name: dudette');  // Success!
})

Подробности

Привязку модуля нельзя напрямую изменить на что-то другое:

const config = require('./configManager');
config = { name: 'mock' };  // <= this doesn't work

... но вы можете изменить свойства объекта, представляющегопривязка модуля:

const config = require('./configManager');
config.name = 'mock';  // <= this works!

... и любой код, использующий модуль, автоматически увидит изменения.

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

Итак, я нашел решение, которое меня не полностью устраивает, но оно работает:

Я просто устанавливаю исходный полный объект и затем для своих тестов изменяю значение определенных свойств, устанавливая их непосредственно передвызов функции, которую я хочу проверить.

пример:

let mockConfig = { person: { name: 'dude', origin: {country: 'France'} } };
jest.mock('../../../configManager', () => mockConfig);


mockConfig.person = {};
mockConfig.person.name = 'dudette';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...