yre*_*uta 2 ruby rake unit-testing ruby-on-rails
我正在阅读Sitepoint的Simply Rails一书,并给出了这些模型:
story.rb
class Story < ActiveRecord::Base
validates_presence_of :name, :link
has_many :votes do
def latest
find :all, :order => 'id DESC', :limit => 3
end
end
def to_param
"#{id}-#{name.gsub(/\W/, '-').downcase}"
end
end
Run Code Online (Sandbox Code Playgroud)
vote.rb
class Vote < ActiveRecord::Base
belongs_to :story
end
Run Code Online (Sandbox Code Playgroud)
并给出了这个装置
stories.yml
one:
name: MyString
link: MyString
two:
name: MyString2
link: MyString2
Run Code Online (Sandbox Code Playgroud)
votes.yml
one:
story: one
two:
story: one
Run Code Online (Sandbox Code Playgroud)
这些测试失败:
story_test.rb
def test_should_have_a_votes_association
assert_equal [votes(:one),votes(:two)], stories(:one).votes
end
def test_should_return_highest_vote_id_first
assert_equal votes(:two), stories(:one).votes.latest.first
end
Run Code Online (Sandbox Code Playgroud)
但是,如果我颠倒了故事的顺序,对于第一个断言,并为第一个断言提供第一个投票,它通过
story_test.rb
def test_should_have_a_votes_association
assert_equal [votes(:two),votes(:one)], stories(:one).votes
end
def test_should_return_highest_vote_id_first
assert_equal votes(:one), stories(:one).votes.latest.first
end
Run Code Online (Sandbox Code Playgroud)
我复制了书中的所有内容,并没有看到关于此的勘误.我的第一个结论是,夹具在声明时从下到上创建了记录,但这没有任何意义
有任何想法吗?
编辑:我正在使用RVM中运行的Rails 2.9
您的灯具没有像您期望的那样获得ID 1,2,3等等 - 当您添加灯具时,它们会根据表名和灯具名称的散列获得ID(我认为).对我们人类而言,它们看起来就像是随机数.
Rails会这样做,因此您可以轻松地通过名称引用其他灯具.例如,灯具
#parents.yml
vladimir:
name: Vladimir Ilyich Lenin
#children.yml
joseph:
name: Joseph Vissarionovich Stalin
parent: vladimir
Run Code Online (Sandbox Code Playgroud)
实际上显示在你的数据库中
#parents.yml
vladimir:
id: <%= fixture_hash('parents', 'vladimir') %>
name: Vladimir Ilyich Lenin
#children.yml
joseph:
id: <%= fixture_hash('children', 'joseph') %>
name: Joseph Vissarionovich Stalin
parent_id: <%= fixture_hash('parents', 'vladimir') %>
Run Code Online (Sandbox Code Playgroud)
请特别注意从扩展parent: vladimir到parent_id: <%= ... %>在子模型-这是Rails的如何处理夹具之间的关系.
故事的道德:不要指望你的灯具有任何特定的顺序,并且不要指望:order => :id在测试中给你有意义的结果.results.member? objX反复使用而不是results == [obj1, obj2, ...].如果您需要固定ID,请自行硬编码.
希望这可以帮助!
PS:列宁和斯大林实际上没有关系.