Мок-модуль Jest несколько раз с разными значениями

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
9
0
11 577
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Добавлять

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.

Другие вопросы по теме