2013-04-20 75 views
1

這些是我在測試中的第一步,因此我不知道如何處理它。 在製作過程中,我使用REST適配器 - Fixtures進行開發。我如何用Jasmine測試這個Ember-Data模型?

例如具有這樣的用戶模型:

Sks.User = DS.Model.extend 
    name: DS.attr("string") 
    email: DS.attr("string") 

    gravatar: Ember.computed(-> 
    email = @get("email") || "" 
    "http://www.gravatar.com/avatar/" + MD5(email) 
).property("email") 

    firstName: Ember.computed(-> 
    fName = @get('name').split(' ')[0] 
).property("name") 

    lastName: Ember.computed(-> 
    lName = @get('name').split(' ')[1] 
).property("name") 

如何可使用TDD/BDD茉莉我測試?我想我應該測試邏輯:名字,姓氏和gravatar,但我怎樣才能把它翻譯成茉莉花?我最近閱讀了很多關於測試的內容,但你知道的理論與練習不同,我只是碰壁了。 :(

我應該模擬服務器,以獲得一個JSON或我應該使用固定裝置?

回答

0

我覺得單元測試模型,你不應該與服務器處理(甚至模擬服務器)在所有 - 這是由適配器決定的,模型的單元測試將用於計算屬性(在這種情況下爲gravatar, firstname, lastname)和其他邏輯(生命週期回調,動作等),您可以測試這些相當簡單的東西 - 他們大部分與服務器隔離開來,例如:

describe "gravatar property", -> 
    it "should append the md5 of the email to the gravatar path", -> 
    user = Sks.User.createRecord name: "my name", email: "[email protected]" 
    expect(user.get('gravatar')).toBe "http://www.gravatar.com/avatar/#{MD5(user.get('email')}" 

如果您使用Ember-Data的RESTAdapter,則可以假設它已經過良好測試(儘管您可能希望編寫更高級別的集成測試以顯示您的模型正在使用適配器數據正確加載)。如果你正在編寫你自己的適配器,你應該有一個單獨的單元測試。

什麼部分應用程序加載

單元測試,你真的只需要加載主命名空間(例如Sks = Ember.Application.create(...))和模型定義(例如Sks.User = DS.Model.extend(...))和它的依賴。當你創建你的模型時,其他所有東西都可以通過傳入模擬/存根來扼殺(請參閱:What is dependency injection?

我在測試環境中使用Ember的路由器自動加載之前曾遇到過一些問題;你可能想要禁用路由器(儘管這只是一個問題,如果你正在爲你的測試加載所有東西 - 我使用jasminerice,所有的JavaScript資源都由Rails服務器編譯並且測試在瀏覽器中運行) - - 我認爲在新的路由器中,您可以使用deferReadinesshttp://emberjs.com/api/classes/Ember.Application.html#method_deferReadiness。以前我在設置autoinit: false

+0

我是否必須加載完整的應用程序才能測試單個模型?或者我可以只加載一個最低限度的(在Ember的情況下我應該加載什麼)? – wryrych 2013-04-21 14:50:13

+0

查看我的更新 - 對於模型單元測試,您基本上只需要加載最小值(名稱空間+模型+依賴項,但您應該將單元測試的依賴項加載) – 2013-04-21 19:24:58