繁体   English   中英

节点中的依赖注入和接口

[英]Dependency Injection and Interfaces in Node

来自C#背景,我使用了接口作为模拟对象的基础。 我自己创建了自定义的模拟对象,并通过C#接口创建了模拟实现。

您如何在JS或节点中执行类似的操作? 创建一个您可以“模拟”的接口,该接口也可以用于也可以实现该接口的真实类吗? 在JS或Node World中这甚至有意义吗?

例如,在Java中,使用相同的方法定义带有方法存根的接口,并以此为基础创建真实类或模拟类。

不幸的是,您不会在JavaScript中找到标准接口。 我从未使用过C#,但是我曾经使用过Java,如果我输入错了,可以更正我,但是看起来您正在谈论创建接口和覆盖方法以同时进行模拟测试,以及能够实现其他类中的那些接口。

由于这不是标准的JavaScript功能,因此我认为您会发现这里有很多非常广泛的答案 但是,为了了解一些流行的库是如何实现这一点的,我可能建议您看一下AngularJS如何看待模拟测试(在线上有很多资源,仅Google就是这样。作为起点,请看一下它们如何将ngMock模块与业力和茉莉花。)

另外,由于JavaScript的灵活性, 您会发现可以覆盖任何类型的“类方法” (即,属于另一个对象的任何函数对象,无论是new “ ed”类还是一个普通对象),只需在需要的地方简单地重新实现它即可...没有特殊的语法。 为了了解您将在何处以及如何完成此工作,建议您从头开始研究JavaScript如何使用原型/原型继承 起点可能是考虑这样的示例:

function Cat(config) {
  if(typeof config !== 'undefined') {
    this.meow = config.meow; // where config can possibly implement certain mock methods
  }
}

Cat.prototype = {
  this.meow = function() {
    // the meow that you want to use as part of your "production" code
  };
};

var config = {};

config.meow = function() {
  // some mock "meow" stuff
};

var testCat = new Cat(config); // this one will use the mock "Cat#meow"

var realCat = new Cat(); // this one will use the prototype "Cat#meow"

在上面的示例中,由于JavaScript查找原型链的方式,如果它在类本身中看到一个实现,它将停止在此处并使用该方法(因此,您已“覆盖”了原型方法)。 但是,在该示例中,如果您不传入config ,那么它将一直使用Cat#meow方法查找原型,并使用该方法。

TL; DR :没有一种实现JavaScript接口的好方法,尤其是兼作模拟的接口(甚至没有实现依赖注入的最佳方法……这也是JavaScript本身的一个陌生概念,即使许多库确实实现了成功用于某些用例。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM