6

如何在我的模型 st 中伪造一个 REST 响应,它并没有真正进入服务,而是返回一个固定的 json?

如果可能的话,给我展示一个覆盖sync()的版本和一个覆盖fetch()的版本。我两者都失败了,所以这将是一个很好的教育,因为它们之间的区别。

4

5 回答 5

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

这应该有效。从骨干文档:

fetch():通过委托给 Backbone.sync 从服务器重置模型的状态

于 2012-06-27T08:01:56.490 回答
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);
    }
}
于 2012-06-25T16:44:44.543 回答
2

看一下主干-人造服务器。它将允许您处理(和“伪造”响应)每个模型(或集合)的任何同步操作(获取、保存等)。

于 2012-11-10T01:54:34.723 回答
0

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

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

于 2015-10-14T06:57:01.140 回答
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()
于 2017-02-23T05:26:08.643 回答