2011-03-05 47 views
-1

我使用Rspec和工廠女孩來設置我的測試。我有一個用戶工廠,然後我用rspec進行測試。帶工廠的Rspec和來自模型的虛擬屬性不起作用?

在一個名爲GameEngine ::公式,我有一個虛擬屬性模塊(實際上馬力已經是我的模型,它在這裏覆蓋):

def hp 
    ((self[:hp] * 5) * (self.level + 1)) if self.first_class == 'Fighter' 
    ((self[:hp] * 4) * (self.level + 1)) if self.first_class == 'Ranger' 
    ((self[:hp] * 2) * (self.level + 1)) if self.first_class == 'Magician' 
end 

當我刪除該虛擬ATTRIB,測試工作正常。但是,如果我離開這裏,我得到的是:

Failure/Error: let(:user) { Factory(:user) } 
ActiveRecord::RecordInvalid: 
    Validation failed: Hp can't be blank 

廠:

Factory.define :user do |f| 
    f.sequence(:username) { |n| "test#{n}" } 
    f.password "1234567890" 
    f.sequence(:email) { |n| "test#{n}@test.com" } 
    f.first_class 'Ranger' 
    f.hp 10000 
    f.strength 100 
    f.magic 100 
    f.dexterity 100 
    f.accuracy 10 
    f.armor 20 
    f.level 1 
end 

這是爲什麼?

+0

什麼是您的工廠是什麼樣子? – raidfive 2011-03-06 03:59:02

+0

我加了工廠。我實際上通過改變ifs結構thanx來解決這個問題。 – Spyros 2011-03-06 04:10:12

回答

2

原始代碼中的問題是,除first_class == 'Magician'以外,它返回nil。如果條件爲假,則帶尾隨條件的語句返回零。

> 1 + 1 if true 
# => 2 

> 1 + 1 if false 
# => nil 

所有三個測試對每個調用進行,所以第2的結果由隨後的一個(多個)屏蔽。

你可以用case語句改寫它:

def hp 
    case first_class 
    when 'Fighter' 
     ((self[:hp] * 5) * (level + 1)) 
    when 'Ranger' 
     ((self[:hp] * 4) * (level + 1)) 
    when 'Magician' 
     ((self[:hp] * 2) * (level + 1)) 
    end 
    end 
+0

偉大的解釋thanx! – Spyros 2011-03-06 06:43:47

-1

我通過將if結構更改爲if..elsif來解決此問題。

我想顯式返回的值,然後有另一個檢查是搞砸的東西。不確定爲什麼會出現這種情況,但是當我這樣做時,它就起作用了。