6

我目前正在使用 requirejs 来管理模块 js/css 依赖项。我想发现让节点通过集中配置文件执行此操作的可能性。所以不要手动做类似的事情

define([    
'jquery'
'lib/somelib'
'views/someview']

每个模块内。

我会让节点注入依赖项,即

require('moduleA').setDeps('jquery','lib/somelib','views/someview')

无论如何,我对任何关注节点依赖注入的项目都很感兴趣。

谢谢

4

3 回答 3

6

我想出了一个依赖注入的解决方案。它被称为注入器,它使用节点的vm库并替换require包含文件时的默认功能。

因此,在您的测试中require('libToTest'),使用. 而不是injectr('libToTest' { 'libToMock' : myMock });. 我想让界面尽可能简单,无需更改正在测试的代码。我认为它运作良好。

值得注意的是,注入器文件是相对于工作目录的,不像 require 是相对于当前文件的,但这无关紧要,因为它只用于测试。

于 2012-02-01T17:45:16.087 回答
5

我之前曾考虑过提供一种替代方案require以在 Node.js 中提供一种依赖注入形式。

模块代码

例如,假设您在code.js中有以下语句: fs = require('fs');

console.log(fs.readFileSync('text.txt', 'utf-8'));

如果您使用 运行此代码node code.js,那么它将打印出text.txt的内容。

喷油器代码

但是,假设您有一个想要抽象出文件系统的测试模块。
您的测试文件test.js可能如下所示:

var origRequire = global.require;
global.require = dependencyLookup;
require('./code.js');

function dependencyLookup (file) {
  switch (file) {
    case 'fs': return { readFileSync: function () { return "test contents"; } };
    default: return origRequire(file);
  }
}

如果现在运行node test.js,它会打印出“测试内容” ,即使它包含code.js。

于 2011-12-29T18:05:15.217 回答
2

我还编写了一个模块来完成此操作,它称为rewire。只需使用npm install rewire然后:

var rewire = require("rewire"),
    myModule = rewire("./path/to/myModule.js"); // exactly like require()

// Your module will now export a special setter and getter for private variables.
myModule.__set__("myPrivateVar", 123);
myModule.__get__("myPrivateVar"); // = 123


// This allows you to mock almost everything within the module e.g. the fs-module.
// Just pass the variable name as first parameter and your mock as second.
myModule.__set__("fs", {
    readFile: function (path, encoding, cb) {
        cb(null, "Success!");
    }
});
myModule.readSomethingFromFileSystem(function (err, data) {
    console.log(data); // = Success!
});

我受到Nathan MacInnes 的注射器的启发,但使用了不同的方法。我不使用vm评估测试模块,实际上我使用节点自己的要求。这样,您的模块的行为与 using 完全相同require()(除了您的修改)。也完全支持调试。

于 2012-06-04T09:25:26.923 回答