我正在将旧的 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 的用例?提前致谢。
最佳答案
我不认为有一种方法可以在导入时访问模块全局变量,因为它首先违背了封装模块的原则。
需要最少重构的替代方法是将以下代码添加到您的所有模块中:
if (typeof exports === "object") {
module.exports = paymentsHandlerUtils;
}
namespace.paymentsHandlerUtils = paymentsHandlerUtils;
它的灵感来自旧的 UMD(通用模块定义)。该条件检测您是否在 commonjs 环境中运行并导出您的变量。然后,您将能够在测试中要求它:
const paymentsHandlerUtils = require('../js/components/payments/payments-handler-utils.js');
否则你需要使用另一个在浏览器中工作的测试套件,因为 Jest 不能。
祝您迁移顺利!
关于javascript - 使用 Jest 测试框架在没有导出的情况下测试 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53690473/