节点中的依赖注入和接口

时间:2015-08-03 05:38:52

标签: javascript node.js

来自C#背景,我使用接口来模拟我的模拟对象。我自己创建了自定义模拟对象,并在C#接口上创建了模拟实现。

你如何在JS或节点中做这样的事情?创建一个可以" mock"关闭和接口将为真正的类,也将能够实现该接口?这在JS或Node World中是否有意义?

例如在Java中,同样的交易,定义一个带有方法存根的接口,并使用它作为创建真实类或模拟类的基础。

1 个答案:

答案 0 :(得分:1)

不幸的是,您并不会将标准界面作为JavaScript的一部分。我从来没有使用过C#,但我已经使用过Java,如果我错了,请纠正我,但看起来你正在谈论为模拟测试目的创建接口和覆盖方法,以及能够在其他类中实现这些接口。

因为这不是一个标准的JavaScript功能,我认为你会发现这里会有很多非常广泛的答案。然而,为了了解一些流行的库如何实现这一点,我可能会建议看一下AngularJS如何看待模拟测试(网上有很多资源,只有谷歌。作为一个起点,看看他们如何使用{{3与Karma和Jasmine一起使用的模块。)

另外,由于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如何查找原型链,如果它在类本身中看到一个实现,它就会停在那里并使用该方法(因此,你已经""#34 ;重写"原型方法)。但是,在该示例中,如果您没有传递config,那么它将一直看到Cat#meow方法的原型,并使用该方法。

TL; DR :实现JavaScript接口并不是一种好的方法,特别是那些兼容模拟的接口(甚至不是实现依赖注入的最佳方式)。 ..这也是JavaScript本身的一个外国概念,即使许多库确实为cetain用例成功实现了它。)