backbone.js中的假模型响应

时间:2012-06-25 16:22:33

标签: json backbone.js

如何在我的模型中伪造REST响应?它不是真的去服务但返回一个固定的json?

如果可能的话,请告诉我一个版本,它会覆盖sync()和覆盖fetch()的版本。我两个都失败了,所以对于他们之间的差异,这将是一个很好的教育。

5 个答案:

答案 0 :(得分:9)

Backbone.Model.extend({
  fetch: function(){
    var model = this;
    model.set({yourStatic: "Json Here"});
  }
}

这应该有效。来自Backbone文档:

  

fetch():   通过委托Backbone.sync

从服务器重置模型的状态

答案 1 :(得分:2)

如果您的问题与单元测试代码有关而无需实时API,请查看Sinon.JS。它有助于模拟整个API服务器响应以进行测试。

这是一个来自Sinon文档的例子,它模仿了jQuery的$ .ajax函数:

{
    setUp: function () {
        sinon.spy(jQuery, "ajax");
    },

    tearDown: function () {
        jQuery.ajax.restore(); // Unwraps the spy
    },

    "test should inspect jQuery.getJSON's usage of jQuery.ajax": function () {
        jQuery.getJSON("/some/resource");

        assert(jQuery.ajax.calledOnce);
        assertEquals("/some/resource", jQuery.ajax.getCall(0).args[0].url);
        assertEquals("json", jQuery.ajax.getCall(0).args[0].dataType);
    }
}

答案 2 :(得分:2)

看看backbone-faux-server。它将允许您处理(并“伪造”响应)任何同步操作(获取,保存等)每个模型(或集合)。

答案 3 :(得分:0)

Sinon.js是一个很好的候选者,虽然如果你想模拟多个响应,设置头文件,处理写入逻辑等可能会有很多工作。

在Sinon.js上构建,FakeRest更进一步,模拟基于JSON对象的完整REST API - 所有客户端。

答案 4 :(得分:0)

我的代码

// config
const TEST_JSON = require('./test.json')

const API_MAP = {
    testA: 'someroot'
}
const FAKE_API_MAP = {
    testA: TEST_JSON
}

// here's model
let BaseModel = Backbone.Model.extend({
    url: function() {
        return `${HOST}${API_MAP[this.resourceName]}/`
    }
})
let FakeModel = Backbone.Model.extend({
    fetch: function(options) {
        return this.sync('', this, _.extend({}, options));
    },
    sync: function(method, model, options) {
        this.set(FAKE_API_MAP[this.resourceName], this.options)
        this.trigger('sync', this);
    },
});

// now it's easy for switch them 
let modelA = new BaseModel({
    resourceName: 'testA'
})
modelA.fetch()

let fakeModelA = new FakeModel({
    resourceName: 'testA'
})
fakeModelA.fetch()