2011-11-30 67 views
2

我使用像这样(的CoffeeScript)主干网模型内google.maps库:如何使用Sinon.JS存储google.maps库?

class Route extends Backbone.Model 

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

在我的测试中,我每当我试图实例化一个Route,我明明在运行到一个问题。如何在我的测试中将google剔除,以便它不会导致此问题?

回答

4

不太了解coffescript,但可以为模型构造函数指定第二个对象作为参数。

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

然后在初始化函数你可以这样写:

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

现在,您可以存根方向服务,或使用另外一个(如果有的话)的单个实例。当您尝试编写测试代码是创建你想测试你的对象新实例

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

关于通过DirectionsService存根的好消息。谢谢 –

+0

感谢您的提示,Javascript总是让我微笑,在我的工作马(A.K.A:Java)中嘲笑这样的对象,它将需要一个充满代码的游泳池。 –

+0

更改实现以允许测试错过了重点 –

1

一个主要故障:

另一种方法是直接更换DirectionService。有一种调用Inversion of control的模式有助于编写可测试的代码。诀窍是你在类中创建的所有东西都会被注入到构造函数中。这样做,在你的测试中,你可以注入一个简单的模拟或存根。所以ProTom的答案就是关于这种模式。

另一种解决方案: 在JavaScript中,我们可以轻松地覆盖我们自己的每个对象/函数。这意味着您可以创建自己的google.map DirectionsService。顺便说一句,它会更好地测试你的代码没有任何依赖于其他库,所以你应该创建自己的谷歌对象与你需要的方法。