require.main.require工作但不在Mocha测试中

问题描述 投票:8回答:3

我编写了一个全局函数来要求我的app / framework的某些文件:

global.coRequireModel = function(name) {
    // CRASH happens here
    return require.main.require('./api/_co' + name + '/_co' + name + '.model');
}

该模块位于/ components / coGlobalFunctions中。

它在我的主应用程序app.js中是必需的,如下所示:

require('./components/coGlobalFunctions');

然后在其他模块中使用我使用的框架中的“东西”:

var baseScheme = coRequireModel('Base');

这可以工作但不是在Mocha测试中,它在require.main.require调用之前给出了一个“错误:找不到模块”。

似乎测试来自另一个源文件夹。但是我认为require.main.require会取出必须相对链接到模块的方面。

编辑:

生活在api / user中的示例测试文件:

var should = require('should');
var app = require('../../app');
var User = require('./user.model');
...
node.js unit-testing path mocha require
3个回答
7
投票

require.main指向直接从节点运行的模块。所以,如果你运行node app.js,那么require.main将指向app.js。另一方面,如果你使用mocha运行它,那么require.main将指向mocha。这可能是您的测试失败的原因。

有关详细信息,请参阅the node docs


5
投票

因为在运行mocha测试时,我的node-webkit应用程序中的require.main不是index.html,所以它左右错误地告诉我们无法解析模块。 Hacky修复了​​我的test-helper.js(所有测试中必需的第一件事)修复它:

var path = require('path')
require.main.require = function (name) {
    // navigate to main directory
    var newPath = path.join(__dirname, '../', name)
    return require(newPath)
}

这感觉不对,虽然它有效。有没有更好的方法来解决这个问题?这就像将上述一些解决方案与#7结合起来以使mocha测试工作一样,但是修改main需要只是在测试感觉真的错误时让一切工作正常。

对于其他避免 - “......” - 混乱解决方案,请参见此处:https://gist.github.com/branneman/8048520


0
投票

这是相当古老的,但这是我的解决方案。

我需要将测试工具模块发布到私有注册表,并且需要mocha测试套件。我希望调用测试代码将测试中的代码传递给线束而不是直接要求它:

var harness = require('test-harness');
var codeUnderTest = harness('../myCode');  

内部线束(在项目node_modules目录中找到),我使用以下代码使require找到正确的文件:

        if (!path.isAbsolute(target)) {
            target = path.join(path.dirname(module.parent.paths[0]), target);
        }
        var codeUndertest = require(target);
        ...
        return codeUnderTest;

这依赖于require路径解析,它总是从查找相对于调用文件的node_modules子目录开始。结合使用module.parent,您可以访问该搜索路径。然后只需删除尾随的node_modules部分并连接相对文件名。

对于不使用相对路径的其他方案,可以使用options参数来完成此操作:

        var codeUndertest = require(target, {paths: module.parent.paths});
        ...
        return codeUnderTest;

这两者也可以结合起来。我使用了第一个表单,因为我实际上使用的是不提供路径选项的proxyquire。

© www.soinside.com 2019 - 2024. All rights reserved.