使用jest测试node的public文件夹中的JavaScript

xlpyo6sf  于 12个月前  发布在  Jest
关注(0)|答案(2)|浏览(215)

我在node js公共目录下的example.js文件中有一个简单的JavaScript函数。
我使用jest进行单元测试。
问题是,如果我在public文件夹中的example.js JavaScript文件中写入以下内容:

module.exports.myFunction = myFunction;

Jest测试文件能够导入它,使用**require()**并执行测试,但是当我运行Web应用程序时,当我服务包含此JavaScript的页面时,浏览器会抱怨:Uncaught ReferenceError:module is not defined

测试节点应用public目录下JavaScript文件的正确方法是什么?

在项目中使用导出和/或导入被报告为无法识别,并导致错误。
这是怎么做到的?

oo7oh9g9

oo7oh9g91#

正如注解中提到的,require(...)module.exportsCommon JS Modules相关,NodeJS运行时原生支持它们,但浏览器不支持。所以基本上你需要添加额外的构建配置,让你的模块在两个运行时都能工作。
如果你想在CommonJs和浏览器友好包中都有输出,你可以用ES Modules编写所有代码,并使用webpack等构建工具来提供不同格式的输出。
此外,starting from Node 13.2.0-它支持ES模块原生。所以我会坚持ES模块进行持续的开发无论如何。
请检查this short article主要JS模块格式的差异。

cyvaqqii

cyvaqqii2#

几个月前,我不得不处理这个问题,当时我无法找到一个准确的答案,但我确实明白这个问题是由于env不同,我们正在运行我们的代码和测试我们的代码。额外的工具当时对我来说不是一个解决方案,所以我为自己创造了这个解决方案,这不是最好的,但工作。

// Include this at the top of the public js file
if (typeof __funcs == 'undefined' || typeof __funcs != 'object') {
    var __funcs = {};
}

function one() {}

function two() {
    __funcs.one();
}

// Include this at the bottom of the public js file
try {
    if (typeof module != 'undefined') {
        // include the functions in here you want to export and test using  
        // Jest in Node env in an isolated manner
        module.exports = __funcs = {
            ...__funcs, one, two 
        };
    } else {
        // include functions in here for situations when you want to test 
        // calls to some other function  
        __funcs = { ...__funcs, one };
    }
} catch (ex) {
    console.error(`Error while exporting entities from [name of the file] script`, ex);
}

字符串

一些要点:

1.双下划线用于指示目的。它是一种命名约定,表明变量是敏感的/内部的,应该小心使用或访问,并防止意外更改或重写。
1.这里使用var增加了这种方法的缺点。你可以摆脱它,但如果你想在测试用例中覆盖好的数量和路径,你必须做出权衡并提出替代方案。
1.我认为您可以通过设计一种方法来设置一种内部命名机制,在这种机制中,您想要为其编写测试用例的每个公共JS文件都有自己独立的_版本,funcs。然而,这将使您编写测试用例变得复杂,其中调用单独文件中的函数。这就是我怀疑我使用var的全部原因以及我们代码的目的。包括在文件的顶部。我认为__funcs不应该被覆盖,我们不必为每个文件声明单独的变量,__funcs将是通用的。
1.如果你想编写独立的测试用例,因此不需要函数,你可以完全消除对var的需求。在这种情况下,你只需在try-catch中的if条件中导出你想测试的东西。
1.我认为你甚至可以通过在测试文件中的globals变量上直接声明你想测试的外部函数来实现funcs的功能,这些外部函数是从你正在测试的函数内部调用的。

相关问题