2012-07-18 94 views
4

這是我第一次爲骨幹模型編寫javascript測試。
在網絡資源中尋找並沒有太多關於這個問題的項目。
我發現這個,Testing Backbone applications with Jasmine and Sinon,這是相當古老(mars 2001)。使用Jasmine測試骨幹模型

無論如何,我想知道:
1)有其他資源更多更新有關此主題的
2)我寫的文字(1)罰款或可以得到改善。


(1)

describe('User model', function() { 
    beforeEach(function() { 
     this.model = new User(); 
     this.collection = new UserCollection(); 
    }); 

    describe('When creating models', function() { 
     it('the url should be equal at corresponding api_get_users value', function() { 
      expect(this.model.url()).toEqual(backendRouter.generate('api_get_users')); 
     }); 

     describe('when no id is set', function() { 
      it('should return the collection URL', function() { 
       expect(this.model.url()).toEqual(this.collection.url); 
      }); 

     }); 
     describe('when id is set', function() { 
      it('should return the collection URL and id', function() { 
       this.model.set({id: 1}); 
       expect(this.model.url()).toEqual(this.collection.url + '/' + this.model.get('id')); 
      }); 
     }); 

    }); 

    describe('when fetching model from server', function() { 
     beforeEach(function() { 
      this.model.set({id: 1}); 
      this.fixture = this.fixtures.Users.valid; 
      this.fixtureResponse = this.fixture.response.users[0]; 
      this.server = sinon.fakeServer.create(); 
      this.server.respondWith(
       'GET', 
       backendRouter.generate('api_get_users') + '/' + this.model.get('id'), 
       JSON.stringify(this.fixtureResponse) 
      ); 
     }); 

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

     it('should make the correct request', function() { 
      this.model.fetch(); 
      expect(this.server.requests.length).toEqual(1); 
      expect(this.server.requests[0].method).toEqual('GET'); 
      expect(this.server.requests[0].url).toEqual(this.model.url()); 
     }); 

     it('should the response not change', function() { 
      this.model.fetch(); 
      this.server.respond(); 
      expect(this.fixtureResponse).toEqual(this.model.attributes); 
     }); 

     it('should exhibit mandatory attributes', function() { 
      expect(this.model.get('id')).toBeGreaterThan(0); 
     }); 
    }); 

}); 
+0

雖然是一個有趣的話題和問題,但您的問題的第二部分可能更適合http://codereview.stackexchange.com/ – 2012-07-18 19:30:04

回答

1

無人佔地面積茉莉測試優於Justin Searls

https://speakerdeck.com/u/searls/p/confidencejs

是一個例子,但看看他的其他演講以及和他的GitHub庫jasmine-given

+0

+1感謝您的參考。實際上,在我的問題中,我提出了更具體的問題:測試骨幹模型。並在茉莉花給出的存儲庫,我找不到我在找什麼。 – 2012-07-18 13:40:48

2

也許SO不是代碼評論的正確位置,請看https://codereview.stackexchange.com/。一些注意事項任何方式:

describe('when id is set', function() { 
    it('should return the collection URL and id', function() { 
     this.model.set({id: 1}); 
     expect(this.model.url()).toEqual(this.collection.url + '/' + this.model.get('id')); 
    }); 
}); 

您應該測試this.collection.url + '/' + 1,因爲這是你想要什麼發送到服務器。也許你會後期改變你的模型的功能,測試會通過,但結果不是你所期望的。

it('should make the correct request', function() { 
     this.model.fetch(); 
     expect(this.server.requests.length).toEqual(1); 
     expect(this.server.requests[0].method).toEqual('GET'); 
     expect(this.server.requests[0].url).toEqual(this.model.url()); 
    }); 

此測試毫無意義,因爲您只需測試Backbone功能,希望通過骨幹人員進行測試。其他兩項測試也一樣。只要你在你的模型中沒有魔法東西,測試默認的Backbone功能就沒有意義了。

+0

+1感謝您的評論非常有用。 – 2012-07-19 07:29:12