【问题标题】:How to stub backbone models constructor?如何存根主干模型构造函数?
【发布时间】:2015-06-20 17:52:17
【问题描述】:

假设我有一个自定义主干模型。

var model = Backbone.Model.extend({
    initialize: function(parameters) {
        var object = {
            key: parameters.key
        };
        this.callMethod();
        this.collection = new Backbone.Collection();
    },

    callMethod: function() {
        //code I want to test
    }
});

如何在不设置所有这些对象或任何其他与使用 QUnit 和 Sinon 的测试无关的东西的情况下测试该模型的新实例?我应该在初始化模型之前以某种方式存根这个初始化方法吗?使用这两个库的正确方法是什么?

感谢您的宝贵时间。

【问题讨论】:

  • 我只想指出你的标题有点不对劲,你不是在尝试存根构造函数而是初始化。那是两个different 的东西。是的,你应该在初始化一个新模型之前存根它,存根不是时间机器 :) 至于 Sinon,我用得不多,但看起来很简单:sinonjs.org/docs/#stubs
  • 称我为哑巴,但我只是不明白你如何存根尚未创建的对象的方法?基本存根看起来像这样 stub = sinon.stub(object, 'methodName')。在初始化之前我找不到存根的例子。
  • 哦,对了,这是一个很好的观点,因为我忙于混淆构造函数/初始化,所以我没有考虑到这个含义。我会尝试在原型上存根它(即在做new model()之前尝试存根model.prototype.initialize
  • 原型存根工作。谢谢

标签: backbone.js qunit sinon


【解决方案1】:

一旦您没有模型实例,您可以存根 Model.prototype。

例子:

spyOn(Model.prototype, "initialize");
var modelInstance = new Model();
expect(Model.prototype.initialize).toHaveBeenCalled()

【讨论】:

    【解决方案2】:

    正如 cmets 所指出的,看起来 OP 确实在寻找 initialize 存根,而不是 constructor 存根,这实际上很容易做到:

    sinon.stub(YourModel.prototype, 'initialize');
    

    但是要回答主题行中的问题,对于其他阅读此内容的人来说...存根构造函数有点棘手,因为构造函数基本上就是类本身(即YourModel 是@987654325 的构造函数@ 班级)。这很重要,因为Sinon 只知道作为某事物的属性 的存根函数(例如,initializeYourModel.prototype 的属性)。也就是说,Sinon 只能存根方法constructor 不是方法。

    解决方案是查看您尝试测试的代码,并在使用它之前查看它是如何获取构造函数的。例如,假设您要测试 FakeViewfoo 方法中实例化 YourModel

    var FakeView = Backbone.View.extend({
        foo: function() { return new YourModel(); }
    });
    

    当这样写时,YourModel 不能被存根。但是如果稍微改一下,让YourModel一个属性:

    var FakeView = Backbone.View.extend({
        foo: function() { return new this.constructor.modelClass(); }
    }, {
        modelClass: YourModel
    });
    

    然后你突然可以存根了:

    var stub = sandbox.stub(FakeView, 'modelClass');
    new FakeView().foo(); // stub.calledWithNew() === true
    

    希望能帮助其他为此苦苦挣扎的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-27
      • 2015-06-04
      • 2012-05-18
      • 2011-11-24
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多