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

cách kiểm tra mô hình tiết kiệm thành công và phản hồi lỗi trong Jasmine?cách đơn vị kiểm tra thành công của đường trục và phản hồi lỗi khi lưu bằng cách sử dụng hoa nhài

Trả lời

1

Bạn có thể sử dụng Sinon.js để tạo máy chủ giả cho các thử nghiệm của mình.

http://sinonjs.org/

Ví dụ mã:

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

Bạn cần Sinon bắt chước phản ứng máy chủ. Thư viện này có các tiện ích như sau:

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

Vì vậy, bất cứ khi nào bạn có Mô hình có tập gốc và id 123, sinon sẽ trả lại cuộc gọi này.

đọc này: http://tinnedfruit.com/2011/03/03/testing-backbone-apps-with-jasmine-sinon.html

Cập nhật: Thêm một workaround thứ hai là yêu cầu hỏi. Mocking phương pháp lưu.

// Sử dụng này trong các thử nghiệm của bạn thay vì Backbone.js Mẫu

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

Tuy nhiên tôi vẫn khuyên bạn nên sử dụng Sinon. Việc chế nhạo Backbone.js không phải là ngôn từ và cũng hỗ trợ các mã phản hồi tiêu đề và các công cụ khác cũng phức tạp hơn và một loại tái tạo lại bánh xe. Trong khi với sinon bạn chỉ cần thêm thư viện một phản ứng máy chủ tạo.

+0

Tôi đang sử dụng các công nghệ sau backbone.js, require.js, jquery, các dịch vụ còn lại trên WebAPI. từ hoa nhài, tôi đang chế nhạo đối tượng mô hình và liên kết với một cái nhìn để kiểm tra đơn vị. khi tôi nhận được phản hồi từ khung nhìn đến mô hình giả, làm thế nào để đơn vị phản hồi lưu (thành công, lỗi) của mô hình. không có cách nào để kiểm tra đơn vị phản ứng của mô hình mà không có tội lỗi. – Gururaj

+0

Sinon chỉ là JavaScript khác, không chắc chắn lý do tại sao bạn không thể thêm nó. Nhưng dù sao, cách giải quyết khác là ghi đè phương thức lưu. Tôi sẽ thêm cách giải quyết đó vào câu trả lời của tôi. –

2

Để kiểm tra điều này mà không có máy chủ giả, bạn có thể kiểm tra xem hàm đã được liên kết với mô hình chưa rồi tự gọi hàm được liên kết. Nói cách khác, loại bỏ phần ajax tiết kiệm ra khỏi mô hình.

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

Tôi không chắc chắn Tôi thích trải qua Sinon đây, rốt cuộc cả cuộc gọi ajax được thực hiện bởi xương sống, không phải do đơn vị bạn đang thử nghiệm, đây là giải pháp của tôi

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(); 
    }); 
Các vấn đề liên quan