来自C#背景,我使用接口将我的模拟对象作为基础。我自己创建了自定义模拟对象,并在C#接口上创建了模拟实现。
如何在JS或节点中执行这样的操作?创建一个您可以“模拟”的接口,该接口也将为能够实现该接口的实际类服务?这在JS或Node World中有意义吗?
例如,在Java中,同样的处理,定义一个带有方法存根的接口,并使用它作为创建真实类或模拟类的基础。
发布于 2015-08-03 05:57:40
不幸的是,您将无法找到标准接口作为JavaScript的一部分。我从未使用过C#,但我使用过Java,如果我错了,请纠正我的错误,但看起来您正在讨论为两个模拟测试目的创建接口和重写方法,以及能够在其他类中实现这些接口。
因为这不是一个标准的JavaScript特性,--我想你会发现这里会有很多非常宽泛的答案--。然而,为了了解一些流行的库是如何实现这一点的,我可能会建议看看AngularJS如何看待模拟测试(网上有很多资源,只需谷歌就行了。作为一个起点,看看他们是如何与Karma和Jasmine一起使用ngMock模块的。
此外,由于JavaScript非常灵活的特性,可以覆盖任何类型的“类方法”(即任何属于另一个对象的函数对象,无论是new'ed的“类”还是普通的对象),只需在需要的地方重新实现它.它没有特殊的语法。要了解您将在哪里以及如何完成这一任务,我建议从根本上看如何使用原型/原型继承。一个起点可能考虑这样的例子:
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如何查找prototype链,如果它在类本身中看到一个实现,它将停止使用该方法(因此,您已经“重写”了prototype方法)。但是,在这个示例中,如果您没有传入一个config,那么它将一直查找Cat#meow方法的原型,并使用该方法。
TL;DR:没有一种很好的方法来实现JavaScript接口,特别是那些双重模拟的接口(甚至没有最好的方法来实现依赖注入.对于JavaScript本身来说,这也是一个外来的概念,尽管许多库确实成功地为cetain用例实现了它。)
https://stackoverflow.com/questions/31780103
复制相似问题