如何使用 Jest 为 javascript 揭示模块模式编写单元测试?

How to write unit test for javascript revealing module pattern with 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 is undefined or MathUtil() is not a function.

我也试过用require()import。但是 MathUtil 没有 module.exportexport.

那么如何使用 Jest 为 javascript 揭示模块模式编写单元测试?

注意:我有一个项目,所有脚本都是用显示模块模式编写的,所以全部转换为 ES2015 模块可能不切实际。

如果您真的想要完全按照写的那样测试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);
});

...但最佳做法是将代码重构为模块。对于revealing module pattern这应该是一个非常简单的过程,只需去掉外包装函数和返回对象,然后将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。检查此 post:https://www.samanthaming.com/journal/2-testing-non-exported-functions/