如何使用 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.export
或 export
.
那么如何使用 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/
例如:我的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.export
或 export
.
那么如何使用 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/