У меня есть функция, которую я хочу протестировать, и эта функция использует импортированный модуль:
var a = require('./a');
function add(b) {
return a + b;
}
module.exports = add;
Этот модуль a возвращает число в этом примере, но в моем реальном проекте я использую его как объект конфигурации, который время от времени изменяется вручную.
var a = 1;
module.exports = a;
Тест на функцию add выглядит так:
describe('add', () => {
it('should add the mock number 1 to 2', () => {
jest.setMock('./a', 1);
const add = require('./add');
expect(add(2)).toBe(3);
});
it('should add the mock number 2 to 2', () => {
jest.setMock('./a', 2);
const add = require('./add');
expect(add(2)).toBe(4);
});
});
Первый тест пройден, второй тест не пройден, потому что он унаследован от первого макета. Есть ли способ поиздеваться над модулем a несколько раз?
Мне нужно решение, которое не подразумевает рефакторинга функции add, а вместо этого сосредоточено на многократном издевательстве над этим модулем. (в моем реальном проекте это файл конфигурации)
Вы можете поиграть с кодом здесь: https://repl.it/@adyz/NocturnalBadComma



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


Добавлять
beforeEach(() => {
jest.resetModules();
});
Заключительные тесты
describe('add', () => {
beforeEach(() => {
jest.resetModules();
});
it('should add the mock number 5 to 2', () => {
jest.setMock('./a', 5);
const add = require('./add');
expect(add(2)).toBe(7);
});
it('should add the mock number 2 to 2', () => {
jest.setMock('./a', 2);
const add = require('./add');
expect(add(2)).toBe(4);
});
});
Демо: https://repl.it/repls/TrustingBelatedPrivatearysoftware
Чтобы добавить к решению @Gigi, я создал еще один пример, используя jest.mock:
В файле multiplier.ts multiplier - это экспортируемая функция, которую мы хотим протестировать:
// file: multiplier.ts
import {getNumber} from './get-number'
const multiplier = (num:number) => num * getNumber()
export {multiplier}
В файле get-number.ts getNumber - это модуль, который мы хотим имитировать:
// file: get-number.ts
const getNumber = () => 2
export {getNumber}
Вот тест:
// file: multiplier.test.ts
// import { multiplier } from "./multiplier" // <-- this will not work
describe("[multiplier]", () => {
beforeEach(() => {
jest.resetModules()
})
it('should mock getNumber so that getNumber return 3', () => {
const mockReturn = 3
jest.mock( './get-number', () => (
{ getNumber: jest.fn(()=>mockReturn) }
))
const { multiplier } = require('./multiplier')
expect(multiplier(2)).toBe(6)
})
it('should mock getNumber so that getNumber return 4', () => {
const mockReturn = 4
jest.mock( './get-number', () => (
{ getNumber: jest.fn(()=>mockReturn) }
))
const { multiplier } = require('./multiplier')
expect(multiplier(2)).toBe(8)
})
it('should mock getNumber so that getNumber return 5', () => {
const mockReturn = 5
jest.mock( './get-number', () => (
{ getNumber: jest.fn(()=>mockReturn) }
))
const { multiplier } = require('./multiplier')
expect(multiplier(2)).toBe(10)
})
})
Примечание: для того, чтобы это работало, нам нужно использовать требование импорта multiplier.ts.