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

标签 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 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);
});

关于javascript - 如何用 Jest 编写 javascript 揭示模块模式的单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51720837/

相关文章:

java - 测试期间记录详细,但发布的应用程序中记录简洁

javascript - Jest : How to test for something inside of a callback function?

javascript - 动态分配 Highcharts.Chart 选项 noData

javascript - 那里有什么好的 JavaScript 散列(代码/表)实现吗?

javascript - Jasminejs - 测试回调

java - easymock 意外行为

javascript - 使用 React Router 进行条件重定向

python - 如何在没有类的情况下为python中的函数编写测试函数

typescript - 在 Jest 测试期间无法从 '../build/Release/magic' 找到模块 'index.js'

unit-testing - 如何使用 JEST 框架模拟 chrome API?