这似乎非常简单;然而,经过两个小时的阅读和反复try ,却没有成功,我承认失败,并要求你们!

我试图用MochaShould.js来测试一些JavaScript函数,但我遇到了范围问题.我已经把它简化为最基本的测试用例,但我无法让它工作.

我有一个名为functions.js的文件,其中只包含以下内容:

function testFunction() {
    return 1;
}

和my tests.js(位于同一文件夹中)内容:

require('./functions.js')

describe('tests', function(){
    describe('testFunction', function(){
        it('should return 1', function(){
            testFunction().should.equal(1);
        })
    })
})

这个测试以ReferenceError: testFunction is not defined分失败.

我能理解为什么,因为我发现的大多数示例要么将对象和函数附加到Node global对象,要么使用module.exports导出它们,但使用这两种方法中的任何一种都意味着我的函数代码会在标准浏览器情况下抛出错误,而这些对象不存在.

那么,在不使用特定于 node 的语法的情况下,如何访问在测试中单独的脚本文件中声明的独立函数呢?

推荐答案

require('./functions.js')

这没用,因为你没有出口任何东西.你所期待的是,testFunction是全球可用的,基本上与

global.testFunction = function() {
    return 1;
}

你只需绕过导出/全局机制.这就是node的设计方式.没有隐含的全局共享上下文(比如浏览器上的window).模块中的每个"全局"变量都被困在其上下文中.

你应该用module.exports.如果您打算与浏览器环境共享该文件,有几种方法可以使其兼容.要快速破解,只需在浏览器中执行window.module = {}; jQuery.extend(window, module.exports),或在 node 中执行if (typeof exports !== 'undefined'){ exports.testFunction = testFunction }.

Node.js相关问答推荐

错误:找不到模块';/var/apps/前端/bash';

NodeJS中的Vertex AI GoogleAuthError

如何在不丢失其他键的情况下解开子文档数组,然后反转该过程?

如何在.npmrc中添加 comments ?

JEST模拟由http服务器控制器导入的ES模块

AWS-ROUTE 53指向S3存储桶,错误是别名目标名称不在目标区域内

使用 playwright 获取页面中同一 url 的所有响应

为什么 Cors 在 NodeJS 中不起作用

运行本地移动自动化测试时,在onPrepare钩子中,ERROR @wdio/cli:utils: A service failed in the 'onPrepare'

在mongoose虚拟属性中处理异步操作

MongoDB:通过匹配输入字符串或输入字符串中的单个单词进行搜索

如何在 Firestore 函数上使用类型模型来获取字段值

在新创建的 Angular 工作区上运行 ng lint 时出错

在 ExpressJS 中将变量传递给 JavaScript

调用 require 时的 const vs let

为什么 JavaScript 的 parseInt(0.0000005) 打印5?

用于排除多个文件的 node.js glob 模式

npm publish 导致'错误:EPERM:不允许操作,取消链接...',errno -4048

名称类型为 mongoose 的字段

如何调试 Gulp 任务?