【问题标题】:How to stub out google.maps library with Sinon.JS?如何使用 Sinon.JS 存根 google.maps 库?
【发布时间】:2012-01-09 21:05:29
【问题描述】:

我在这样的 Backbone 模型中使用 google.maps 库(coffeescript):

class Route extends Backbone.Model

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

在我的测试中,每当我尝试实例化 Route 时,显然都会遇到问题。如何在我的测试中将 google 存根,以免导致此问题?

【问题讨论】:

    标签: javascript google-maps backbone.js jasmine sinon


    【解决方案1】:

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

    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 总是让我微笑,要在我的工作马(A.K.A:Java)中模拟这样的对象,需要一个装满代码的游泳池。
    • 更改实现以允许测试没有抓住重点
    【解决方案2】:

    尝试编写可测试代码时的主要失败之一是在要测试的对象中创建新实例。有一个调用Inversion of control 的模式有助于编写可测试的代码。诀窍是您将在类中创建的所有内容都将被注入到构造函数中。这样做,在您的测试中,您可以只注入一个简单的模拟或存根。所以 ProTom 的答案就是关于这个模式。

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

    【讨论】:

      猜你喜欢
      • 2018-03-06
      • 2016-12-02
      • 2017-07-12
      • 2020-07-01
      • 2016-08-16
      • 1970-01-01
      • 2014-01-31
      • 2012-05-22
      • 1970-01-01
      相关资源
      最近更新 更多