我正在将旧的JS代码库移动到现代JS . 第一步是向当前代码库添加一些测试 . 当前的代码库基本上是一堆单独的JS文件,每个文件都包含在IIFE中 .
这本身就是测试的一个问题,因为除非某些东西暴露在全局对象中,否则你无法进入IIFE . 我重构的一些代码是带有属性的简单JS对象,它附加到全局对象上的命名空间(下面的 namespace
只是一个占位符名称),例如:
var namespace = window.namespace || {};
var paymentsHandlerUtils = {
getNewValue: function(selectedAmount) {
'use strict';
return selectedAmount < 1 || isNaN(selectedAmount)
? ''
: '$' + selectedAmount;
},
getSelectedAmount: function(value) {
'use strict';
return value % 1 === 0 ? parseInt(value) : parseFloat(value).toFixed(2);
}
};
namespace.paymentsHandlerUtils = paymentsHandlerUtils;
我的问题是,您将如何使用Jest进行测试?我已经尝试过如下要求:
const paymentsHandlerUtils = require('../js/components/payments/payments-handler-utils.js');
这会运行,但 paymentsHandlerUtils
对象只是一个空的 {}
. 不足为奇,因为只需执行JS就无法返回任何内容 . 但是, window.namespace
也未定义 . 似乎代码没有在jsDOM的上下文中执行,因此不会创建全局 .
有没有办法让这个工作,或者这不是Jest的用例?提前致谢 .
1 回答
我认为在导入时没有办法访问模块全局变量,因为它首先违背了封装模块的原则 .
需要最少重构的另一种方法是将以下代码添加到所有模块中:
它受旧UMD(通用模块定义)的启发 . 条件检测您是否在commonjs环境中运行并导出变量 . 然后,您可以在测试中要求它:
否则,您需要使用另一个在浏览器中工作的测试套件,因为Jest没有 .
祝你的迁移好运!