如何在我的模型中伪造REST响应?它不是真的去服务但返回一个固定的json?
如果可能的话,请告诉我一个版本,它会覆盖sync()和覆盖fetch()的版本。我两个都失败了,所以对于他们之间的差异,这将是一个很好的教育。
答案 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()