6

モデルで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サーバーの応答全体をモックするのに役立ちます。

jQueryの$.ajax関数をモックするSinonドキュメントの例を次に示します。

{
    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

backback-faux-serverを見てください。これにより、モデル(またはコレクション)ごとに任意の同期操作(フェッチ、保存など)を処理(および「偽の」応答)することができます。

于 2012-11-10T01:54:34.723 に答える
0

Sinon.jsは良い候補ですが、少数の応答をシミュレートしたい場合は、ヘッダーのセットアップ、書き込みロジックの処理などに多くの作業が必要になる可能性があります。

Sinon.jsに基づいて構築された、FakeRestはさらに一歩進んで、JSONオブジェクト(すべてクライアント側)に基づいて完全なRESTAPIをシミュレートします。

于 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 に答える