【问题标题】:How to write unit test for javascript revealing module pattern with Jest?如何用 Jest 为 javascript 揭示模块模式编写单元测试?
【发布时间】:2018-08-07 07:08:40
【问题描述】:

例如:我的 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 模块可能不切实际。

【问题讨论】:

  • 您的测试范围内是否还有MathUtil 函数?看来测试并没有以任何方式导入它。
  • 如何将MathUtil 添加到范围? MathUtil 没有任何导出,所以我认为我不能使用导入。
  • 如果你用这种方式写了一个完整的项目,你的其他文件如何找到你的实用函数?
  • 我继承了这个项目,每个文件都是这样写的。所以所有对象都通过window 访问。该应用程序可以访问window.MathUtil,但这对 Jest 不起作用。顺便说一句,MathUtil 只是一个示例,展示了如何在这个项目中编写代码。
  • @JaredSmith 为了完整起见:默认的 Jest 环境是 jsdom,其中包含一个 window 对象,并且可以使用 setupFiles 来设置诸如全局变量之类的东西......也就是说,我同意模块绝对是最佳实践。

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


【解决方案1】:

如果您真的想完全按照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);
});

【讨论】:

  • 所以没有办法将MathUtil 添加到window 以便Jest 访问就像在test() 中调用window.MathUtl 一样?恐怕将每个文件都更新为 module.exports 是唯一的选择。
  • 虽然此答案中的信息是正确的,但它实际上并没有回答问题。
  • @Chanh 我在不修改 math_utils.js 的情况下更新了我的答案
【解决方案2】:

您可以为此使用babel-plugin-rewire。查看此帖子:https://www.samanthaming.com/journal/2-testing-non-exported-functions/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多