我正在使用类似的骨干模型中的google.maps库(coffeescript):

class Route extends Backbone.Model

  initialize: ->
    @directionsService = new google.maps.DirectionsService()

在我的测试中,我每当尝试实例化 Route, ,我显然遇到了一个问题。我该如何存根 google 在我的测试中,它不会引起这个问题?

有帮助吗?

解决方案

对CoffScript了解不多,但是您可以将模型构造函数作为参数为第二个对象。

var mymodel = new Route({/*attributes*/}, {directionService: yourStub});

然后,在初始化函数中,您将编写:

initialize: function(atts, options) {
  this.directionService = options.directionService || new google.maps.DirectionsService();
}

现在,您可以对方向服务或使用另一个(如果有的话)进行单个实例。

另一种方法是直接替换Directionservice:

var origService = google.maps.DirectionsService;
google.maps.DirectionsService = function() {/*your stub*/};
var route = new Route();
google.maps.DirectionsService = origService;

其他提示

当您尝试编写可测试代码的主要故障之一是在要测试的对象中创建新实例。有一个模式调用 控制反转 这有助于编写可测试的代码。诀窍是,您将在同类中创建的所有内容都将注入构造函数。这样做,在您的测试中,您只能注入一个简单的模拟或存根。因此,原型的答案是关于这种模式的。

另一个解决方案:在JavaScript中,我们可以轻松地覆盖每个对象/函数。这意味着您可以创建自己的Google.map DirectionsService。顺便说一句,最好不要在没有任何其他液体的情况下测试您的代码,因此您应该使用所需的方法创建自己的Google对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top