Mik*_*ite 1 dependency-injection node.js
将依赖项注入模型的最佳实践是什么?特别是,如果他们的getter是异步的,如同mongodb.getCollection()?
重点是一次注入依赖项
var model = require('./model')({dep1: foo, dep2: bar});
Run Code Online (Sandbox Code Playgroud)
并调用所有成员方法,而不必将它们作为参数传递.我也不希望每个方法都以异步getter的瀑布开始.
我最终得到了一个专用的exports包装器,它代理所有调用并传递异步依赖项.
然而,这会产生很多开销,重复很多,我通常不喜欢它.
var Entity = require('./entity');
function findById(id, callback, collection) {
// ...
// callback(null, Entity(...));
};
module.exports = function(di) {
function getCollection(callback) {
di.database.collection('users', callback);
};
return {
findById: function(id, callback) {
getCollection(function(err, collection) {
findById(id, callback, collection);
});
},
// ... more methods, all expecting `collection`
};
};
Run Code Online (Sandbox Code Playgroud)
注入依赖项的最佳实践是什么,尤其是那些具有异步getter的依赖项?
如果你需要支持单元测试,那么像javascript这样的动态语言中的依赖注入可能比它的价值更麻烦.请注意,您需要的其他模块几乎不会使用您在Java,.NET和其他静态编译语言中看到的DI模式.
如果您想模拟行为以隔离特定的代码单元以进行测试,请参阅"sinon"模块http://sinonjs.org/.它允许您动态交换进/出拦截器,这些拦截器既可以监视方法调用,也可以完全替换它们.在实践中,您可以编写一个需要模块的mocha测试,然后需要一个在代码中使用的模块.使用sinon在该模块上监视或存根方法,因此,您可以隔离代码.
有一个场景我已经无法与兴农完全隔离第三方代码,这是当行为需要()荷兰国际集团一模块执行一些行为,你不希望在您的测试运行.对于那种情况下,我做了一个名为"mockrequire"超级单模https://github.com/mateodelnorte/mockrequire,允许你提供需要的,而不是实际的模块内嵌模拟.您可以提供一个使用来自sinon的间谍或存根的模拟,并且具有与所有其他测试相同的语法和模式.
希望这可以回答你帖子中的基本问题.;)
| 归档时间: |
|
| 查看次数: |
1523 次 |
| 最近记录: |