Как написать модульный тест для выявления шаблонов модулей Javascript с помощью Jest?

Например: мой math_util.js

var MathUtil = function(){
  function add(a,b){
    return a + b;
  }
  return {
    add: add
  };
}

Я буду использовать Jest для тестирования add(). Так я напишу

test('add', ()=>{
  expect(MathUtil().add(1,1)).toBe(2);
});

Но я получаю MathUtil не определено или MathUtil() это не функция.

Я также пытался использовать require() или же import, Но MathUtil не имеет module.export или же export,

Итак, как написать модульный тест для javascript, раскрывающий шаблон модуля с помощью Jest?

Примечание. У меня есть проект, в котором все сценарии написаны с использованием шаблона модуля, поэтому преобразование всех в модуль ES2015 может оказаться непрактичным.

2 ответа

Решение

Если вы действительно хотите проверить math_util.js именно так, как написано, вы можете сделать это:

// ---- math_util.test.js ----
const fs = require('fs');
const path = require('path');
const vm = require('vm');

const code = fs.readFileSync(path.join(__dirname, '/math_util.js'), 'utf-8');
const MathUtil = vm.runInThisContext(code + '; MathUtil');

test('add', ()=>{
  expect(MathUtil().add(1,1)).toBe(2);
});

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

// ---- math_utils.js ----
export function add(a,b){
  return a + b;
}


// ---- math_utils.test.js ----
import { add } from './math_utils';

test('add', ()=>{
  expect(add(1,1)).toBe(2);
});

Вы можете использовать babel-plugin-rewireдля этого. Проверьте этот пост: https://www.samanthaming.com/journal/2-testing-non-exported-functions/

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