Node.js+;测试:DI与硬依赖

Node.js+;测试:DI与硬依赖,node.js,unit-testing,dependency-injection,Node.js,Unit Testing,Dependency Injection,我在搞回购协议。并添加重构以将某些功能提取到类中 问题是——我更喜欢使用从外部传递依赖项(DI)。但我发现这不是node.js应用程序的常见模式 所以问题是,有没有好的例子(到repos的链接)让人们使用DI来提供依赖关系 相反的观点是--“我们总是可以使用proxyquire模块来模拟依赖关系” 附言 我建议的代码示例如下 // use const inst = new Cls(getDep1(), getDep2()); // where getDep1 / getDep2 provide

我在搞回购协议。并添加重构以将某些功能提取到类中

问题是——我更喜欢使用从外部传递依赖项(DI)。但我发现这不是node.js应用程序的常见模式

所以问题是,有没有好的例子(到repos的链接)让人们使用DI来提供依赖关系

相反的观点是--“我们总是可以使用
proxyquire
模块来模拟依赖关系”

附言 我建议的代码示例如下

// use
const inst = new Cls(getDep1(), getDep2());
// where getDep1 / getDep2 provide dependencies from side modules
而不是

//Cls
const dep1 = require('dep1');
const dep2 = require('dep2');
module.exports = function Cls() {
  // deps usage
}

// and 
const inst = new Cls();

问题在于node.js相关项目中的参数

您的示例非常清楚。如果您想在测试中为类依赖项配置存根/模拟,而不使用proxyquire或mockry或其他一些require补丁程序,那么您必须在代码中提供另一个入口点

您可以在示例中明确使用DI-like:

function Cls(dep1, dep2) {
  this.dep1 = dep1;
  this.dep2 = dep2;
}
它可以独立存在,那么调用代码将负责导入类、配置其依赖项并正确实例化它。这样,您的
Cls
就被隔离,并且本身就可以进行单元测试

您还可以公开需要作为公共属性处理的依赖项:

const dep1 = require('dep1');
const dep2 = require('dep2');
module.exports = function Cls() {
   this.dep1 = dep1;
   this.dep2 = dep2;
}
这可能允许中定义的
Cls
模块也包含将其与其dep关联的代码,同时仍然允许您的单元测试使用mock/stub对象轻松配置
Cls
。这取决于无副作用的要求:(


您的示例非常清楚。如果您想在测试中为类依赖项配置存根/模拟,而不使用proxyquire或Mockry或其他一些require修补程序,那么您必须在代码中提供另一个入口点

您可以在示例中明确使用DI-like:

function Cls(dep1, dep2) {
  this.dep1 = dep1;
  this.dep2 = dep2;
}
它可以独立存在,那么你的调用代码将负责导入你的类,配置它的依赖项,并正确地实例化它。这样你的
Cls
就被隔离了,并且可以自己进行单元测试

您还可以公开需要作为公共属性处理的依赖项:

const dep1 = require('dep1');
const dep2 = require('dep2');
module.exports = function Cls() {
   this.dep1 = dep1;
   this.dep2 = dep2;
}
这可能允许中定义的
Cls
模块也包含与其dep关联的代码,同时仍然允许您的单元测试使用mock/stub对象轻松配置
Cls
。这取决于无副作用的要求:(