我刚学习RoR而且我在单元测试中遇到了一个问题,我编写的一个简单函数不会适当地修改它的对象。我必须遗漏一些非常基本的东西,因为我在任何论坛都看过这个问题。
我通过“rake test test / functional / song_test.rb”用rake运行我的测试。数据从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>.
我使用puts()验证了更改确实在投票中发生了!功能。但是在函数返回后,song1.rating值没有改变。这是投票的班级!功能
class Song < ActiveRecord::Base
validates :rating, :presence => true
def vote!(num_stars)
@rating = num_stars
end
end
我认为对象有两个副本和投票!在临时对象上调用函数。但我不明白这是怎样或为什么会这样。
答案 0 :(得分:1)
rating
属性与@rating
实例变量无关。您的vote!
方法应如下所示:
def vote!(num_stars)
self.rating = num_stars
end
您在现有代码中所做的是创建一个未使用的实例变量。
作为一个注释,按照惯例,名为vote!
的方法可以保存对模型所做的更改。例如:
self.update_attribute(:rating, num_stars)