5
 onSaveEvent: function (event) {
                if (this.model !== null) {
                    var that = this;

                    this.model.save(this.model.toJSON(), {
                        success: function (model) {
                            that.model = model;
                            that.model.attributes.isDirty = false;
                        },

                        error: function (model, xhr) {
                            that.model.attributes.isDirty = true;
                        }
                    });
                }
            }
        }

ジャスミンでモデルの保存の成功とエラー応答を単体テストする方法は?

4

4 に答える 4

2

偽のサーバーなしでこれをテストするには、関数がモデルにバインドされていることをテストしてから、バインドされた関数を自分で呼び出すことができます。つまり、モデルから ajax 保存部分をモック アウトします。

var view = new YourView()
jasmine.spyOne(view.model, 'save')
view. onSaveEvent()
var args = view.model.save.mostRecentCall.args

args[1].success()
expect(view.model.attributes.isDirty).toBeFalsy()

args[1].error()
expect(view.model.attributes.isDirty). toBeTruthy()
于 2013-05-06T06:57:25.100 に答える
1

Sinon.js を使用して、テスト用の偽のサーバーを作成できます。

http://sinonjs.org/

コード例:

  describe("when saving a user model", function() {

    beforeEach(function() {
      this.server = sinon.fakeServer.create();
      this.responseBody = '{"name":"test user","id":1,"title":"tester"}';
      this.server.respondWith(
        "POST",
        "/user",
        [
          200,
          {"Content-Type": "application/json"},
          this.responseBody
        ]
      );
      this.eventSpy = sinon.spy();
    });

    afterEach(function() {
      this.server.restore();
    });

    it("should not save when name is blank", function() {
      this.user.bind("error", this.eventSpy);
      this.user.save({"name": ""});

      expect(this.eventSpy).toHaveBeenCalledOnce();    
      expect(this.eventSpy).toHaveBeenCalledWith(this.user, "cannot have a blank name");
    });

    it("should call the server", function() {
      this.user.save();
      expect(this.server.requests[0].method).toEqual("POST");
      expect(this.server.requests[0].url).toEqual("/user");
      expect(JSON.parse(this.server.requests[0].requestBody)).toEqual(this.user.attributes);
    });

  });
于 2013-05-06T00:17:28.733 に答える
0

サーバーの応答をエミュレートするには sinon が必要です。このライブラリには、次のようなユーティリティがあります。

 this.server.respondWith("GET", "/episode/123",
      [200, {"Content-Type": "application/json"},
      '{"id":123,"title":"Hollywood - Part 2"}']);

したがって、ルート エピソードと ID 123 を持つモデルがある場合はいつでも、sinon はフェッチ呼び出しでこれを返します。

これを読んでください: http://tinnedfruit.com/2011/03/03/testing-backbone-apps-with-jasmine-sinon.html

更新: 質問者のリクエストとして 2 番目の回避策を追加します。モック保存方法。

// Backbone.js モデルの代わりにテストでこれを使用します

var ExtendedModel = Backbone.Model.extend({
    //mocked save:
    save : function(data, options){
         if( data ){
             this.set(data);
         }
         var mocked = this.toJSON();
         if( !mocked.id ){
             mocked.id = new Date().getTime();
         } 
         mocked = this.parse(mocked);
         if( options.success ){
             options.success(this);  
         } 
         if( options.error ){
             options.error(this);  
         } 
    }
});

var MyModel = ExtendedModel.extend({
});

ただし、Sinon を使用することをお勧めします。Backbone.js のモックはエレガントではなく、ヘッダー応答コードのサポートやその他のものもより複雑で、車輪の再発明のようなものです。sinon を使用している間は、ライブラリを作成サーバーの応答に追加するだけです。

于 2013-05-06T00:18:00.940 に答える