我编写了一个全局函数来要求我的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');
...
require.main
指向直接从节点运行的模块。所以,如果你运行node app.js
,那么require.main
将指向app.js
。另一方面,如果你使用mocha
运行它,那么require.main
将指向mocha。这可能是您的测试失败的原因。
有关详细信息,请参阅the node docs。
因为在运行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
这是相当古老的,但这是我的解决方案。
我需要将测试工具模块发布到私有注册表,并且需要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。