Node中的依赖注入和接口

Dependency Injection and Interfaces in Node

本文关键字:接口 注入 依赖 Node      更新时间:2023-09-26

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

如何在JS或node中做这样的事情?创建一个可以"模拟"的接口,并且该接口将为能够实现该接口的实际类服务?这在JS或Node世界中有意义吗?

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

不幸的是,您将无法找到作为JavaScript一部分的标准接口。我从未使用过c#,但我使用过Java,如果我错了请纠正我,但看起来您正在谈论为模拟测试目的创建接口和重写方法,以及能够在其他类中实现这些接口。

因为这不是一个标准的JavaScript特性,所以我想你会发现这里有很多非常广泛的答案。然而,为了了解一些流行的库是如何实现这一点的,我可能会建议看看AngularJS是如何看待模拟测试的(网上有很多资源,只要谷歌一下就可以了)。作为起点,看看他们如何使用ngMock模块与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查找原型链的方式,如果它在类本身中看到实现,它将停在那里并使用该方法(因此,您已经"覆盖"了原型方法)。然而,在这个例子中,如果你没有传递一个config,那么它会一直寻找Cat#meow方法的原型,并使用那个。

TL;DR:没有一种实现JavaScript接口的好方法,尤其是那些兼作mock的接口(甚至没有一种实现依赖注入的最好方法……这对JavaScript本身来说也是一个陌生的概念,尽管许多库在某些用例中成功地实现了它。