来自C#背景,我使用接口来模拟我的模拟对象。我自己创建了自定义模拟对象,并在C#接口上创建了模拟实现。
你如何在JS或节点中做这样的事情?创建一个可以" mock"关闭和接口将为真正的类,也将能够实现该接口?这在JS或Node World中是否有意义?
例如在Java中,同样的交易,定义一个带有方法存根的接口,并使用它作为创建真实类或模拟类的基础。
答案 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用例成功实现了它。)