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

时间:2018-08-07 07:08:41

标签: javascript unit-testing jestjs revealing-module-pattern

例如:我的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.exportexport

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

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

1 个答案:

答案 0 :(得分: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);
});

...但是最佳实践是将代码重构为模块。对于应该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);
});