2013-05-05 4 views
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; 
         } 
        }); 
       } 
      } 
     } 

Как выполнить тестирование теста успешности и ошибок в модели Jasmine?Как выполнить тестирование на успех позвоночника и ответ на ошибку при сохранении с помощью жасмина

ответ

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); 
    }); 

    }); 
0

Вам нужно Sinon эмулировать ответов сервера. Эта библиотека имеет утилиты, как это:

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

Поэтому, когда у вас есть модель с корневым эпизодом и ид 123, Sinon возвратит это на выборках вызова.

прочитать: http://tinnedfruit.com/2011/03/03/testing-backbone-apps-with-jasmine-sinon.html

Обновление: Добавление второго обхода как запрос Asker. Измерительный метод сохранения.

// Используйте это в ваших тестах вместо 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 не является ellegant, а также поддерживает коды ответа заголовка, а другие вещи также сложнее и своего рода изобретают велосипед. В то время как с помощью sinon вам просто нужно добавить библиотеку в ответ на создание сервера.

+0

Я использую следующие технологии: backbone.js, require.js, jquery, службы восстановления через WebAPI. от жасмина, я издеваюсь над объектом модели и привязываюсь к представлению для модульного тестирования. когда я получаю ответ от представления на макет модели, как объединить ответы о сохранении модели (sucess, error). не существует способа модульного тестирования ответов модели без синона. – Gururaj

+0

Sinon - это просто другой JavaScript lib, не знаете, почему вы не можете его добавить. Но в любом случае другим способом является перезапись метода сохранения. Я добавлю это обходное решение в свой ответ. –

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() 
0

Я не уверен, что я люблю ходить через Синоне здесь, Afterall вызов Ajax производится позвоночником, а не блоком тестируемому, вот мое решение

var Model = Backbone.Model.extend({ 
     success_callback : function (model){ 
     this.model = model; 
     this.model.attributes.isDirty = false; 

     }, 
     error_callback: function (model, xhr){ 

     }, 
     onSaveEvent: function (event) { 

     this.save([], { 
      success: _.bind(this.save_success, this), 
      error: _.bind(this.error_callback, this); 
     }); 
    }); 


    var callback_invoker = function(type_str, which_argument) { 
     this.which_argument = which_argument || 0; 
     this.type_str = type_str; 
     var func = function() { 
     var options = arguments[this.which_argument] || {}; 
     if (this.type_str == 'success') { 
      var run = options.success || function() {}; 

     }else if (this.type_str == 'error') { 
      var run = options.error || function() {}; 
     } 
     run(); 
     }; 
     this.function = _.bind(func, this); 
    }; 

    it('save success calls callback', function() { 
     instance = new Model(); 
     spyOn(instance, 'save_success'); 
     spyOn(_,'bind').andCallThrough(); 
     var invoker = new callback_invoker('success', 1); 
     spyOn(instance, 'save').andCallFake(invoker.function); 
     instance.onSaveEvent(); 
     expect(_.bind).toHaveBeenCalledWith(instance.save_success, instance); 
     expect(instance.save_success).toHaveBeenCalled(); 
    }); 

 Смежные вопросы

  • Нет связанных вопросов^_^