我编写了一个全局函数来要求我的应用程序/框架的某些文件:
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');
...
答案 0 :(得分:7)
require.main
指向直接从节点运行的模块。因此,如果您运行node app.js
,则require.main
将指向app.js
。另一方面,如果您使用mocha
运行它,则require.main
将指向mocha。这可能是您的测试失败的原因。
请参阅the node docs了解更多详情。
答案 1 :(得分: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测试工作一样,但是修改主要部分只需要在测试真正错误时使一切正常工作。
对于其他避免 - " .." -mess解决方案,请参见此处: https://gist.github.com/branneman/8048520
答案 2 :(得分: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;
这取决于所需的路径解析,该解析始终从查找相对于调用文件的node_modules子目录开始。将其与module.parent耦合,您就可以访问该搜索路径。然后只需删除尾随的node_modules部分并连接相对文件名即可。
对于其他不使用相对路径的方案,这可以通过options参数来完成:
var codeUndertest = require(target, {paths: module.parent.paths});
...
return codeUnderTest;
这两个也可以合并。之所以使用第一种形式,是因为我实际上正在使用不提供路径选项的proxyquire。