2013-10-15 53 views
1

我剛剛學習RoR,並且在單元測試中遇到了一個問題,我寫的一個簡單函數不會適當地修改它的對象。我必須錯過一些非常基本的東西,因爲我在任何論壇上都看到過這個問題。使用函數修改ActiveRecord模型

我用rake通過「rake test test/functional/song_test.rb」運行我的測試。數據從yaml文件加載,似乎是正確的。但是當我打電話給我的「投票!」時函數(見下文)修改屬性@rating,測試中的變化不可見,並且我的斷言失敗。

test "vote!" do 
    song1 = songs(:song1)       # 'songs' was loaded from a yaml file 
    assert song1.respond_to?('vote!'), "Can't vote!()!" 
    assert_equal 5, song1.rating, "Rating is wrong" # assertion passes 

    song1.vote!(1) 

    assert_equal 1, song1.rating, "Rating should be 1" # assertion fails 
end 

這裏是失敗消息:

SongTest#test_vote! = 0.00 s       
    1) Failure: 
test_vote!(SongTest) [/test/functional/song_test.rb:35]: 
Rating should be 1. 
<1> expected but was 
<5>. 

我與看跌期權()的變化不會投票中出現驗證!功能。但是在函數返回之後,song1.rating的值沒有改變。這是與投票類!功能。

class Song < ActiveRecord::Base 
    validates :rating, :presence => true 

    def vote!(num_stars) 
    @rating = num_stars 
    end 
end 

我在想,有兩個副本的對象莫名其妙地投票!函數在臨時對象上被調用。但我不明白這將是怎樣或爲什麼。

回答

1

rating屬性和@rating實例變量不相關。你vote!方法應該是這樣的:

def vote!(num_stars) 
    self.rating = num_stars 
end 

你在現有的代碼做的是創造出一種不使用實例變量是什麼。

作爲說明,按照慣例,稱爲vote!的方法將具有保存對模型所做更改的效果。例如:

self.update_attribute(:rating, num_stars) 
+0

謝謝! (對於這兩個提示!) – user823981