6

現在、モジュールの js/css 依存関係を管理するために requirejs を使用しています。一元化された構成ファイルを介してノードにこれを実行させる可能性を発見したいと思います。したがって、次のようなことを手動で行う代わりに

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

各モジュール内。

ノードに依存関係を注入させます。

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

とにかく、ノードの依存性注入を検討しているプロジェクトに興味があります。

ありがとう

4

3 に答える 3

6

依存性注入の解決策を思いつきました。これはinjectrと呼ばれ、ノードのvmライブラリを使用しrequire、ファイルをインクルードするときのデフォルト機能を置き換えます。

したがって、テストでは、 の代わりにrequire('libToTest')を使用しますinjectr('libToTest' { 'libToMock' : myMock });。テスト対象のコードを変更する必要がなく、インターフェースをできるだけ単純なものにしたかったのです。私はそれがかなりうまくいっていると思います。

injectr ファイルは、現在のファイルに対して相対的な require とは異なり、作業ディレクトリに対して相対的であることに注意する価値がありますが、テストでのみ使用されるため、それは問題ではありません。

于 2012-02-01T17:45:16.087 に答える
5

私は以前require、Node.js で依存性注入の形式を利用できるようにするための代替手段を提供するというアイデアをいじりました。

モジュールコード

たとえば、code.jsに次のステートメントがあるとします。 fs = require('fs');

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

このコードを で実行すると、 text.txtnode code.jsの内容が出力されます。

インジェクターコード

ただし、ファイル システムを抽象化したいテスト モジュールがあるとします。
テスト ファイル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);
  }
}

ここで を実行すると、 code.jsが含まれているにもかかわらず、node test.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テストモジュールの評価には使用しません。実際、ノード自体のrequireを使用します。このようにして、モジュールはrequire()(変更を除いて)使用するのとまったく同じように動作します。また、デバッグは完全にサポートされています。

于 2012-06-04T09:25:26.923 に答える