我有使用CommonJS的模块风格钛项目。 然而代码使用绝对路径,这样,当它建立的绝对路径是沙箱应用程序目录。
var foo = require("/lib/module");
我想运行在命令行上一些测试,并有茉莉节点的工作。 然而,当测试执行模块,该模块将在他们的要求陈述上述绝对路径。
有没有一种方法来隔离(可能chroot的)节点来解决绝对需要的路径到一个特定的目录? 如果是的话怎么样?
-- RepositoryRoot/
|- app/
| \- Resources/
| |- app.js # Has require("/lib/module1.js")
| \- lib/
| |- module1.js # Has require("/lib/module2.js")
| \- module2.js
\- tests/
\- module1.spec.js # Has require("../app/Resources/lib/module1")
# Or require("/lib/module1")
之后发现这里的解决方案是什么,我了解到:简短的回答确切上面的问题是,你不能这样做 。 节点读取绝对路径,绝对路径。 因此,在短期的答案是从绝对到伪绝对 (相对)路径改变我的路径。 下面是从报价这个博客帖子是带来了曙光:
CommonJS的的钛执行require()
是越野车和不能正确支持相对路径。 试图茉莉节点的测试运行中的项目集成了最低限度,甚至复杂的目录树时,这是一个重大的问题。
一个可能的解决方案的问题是在不使用相对路径require()
在钛(但你可以自由地使用他们在您的茉莉规格通过节点运行)。 相反,相对路径,我们需要使用具有完整路径Resources
作为根目录。
这是通过设定完成NODE_PATH
环境变量运行的任何节点的命令之前。 这样的路径,如`需要(“模块/路径”)是由节点和钛解决。
有几个注意事项。 有些模块强制绝对路径的需要。 在这种情况下,一个需要proxyquire只要不存在任何循环依赖关系,这将工作模拟出的绝对路径。 此外,由于节点没有钛API的你还必须包括mockti包模拟出钛API。 使用这个在您的spec_helper.js:
global.Ti = require("mockti");
和
proxyquire = require("proxyquire");
var myModule = proxyquire("relative/path/to/MyModule", {
"/absolute/path/to/some/module": require("absolute/path/to/some/module")
});