我在Rails中有一对多的关系:
class User < ActiveRecord::Base
has_many :activities, :order => "added_at DESC"
class Activity < ActiveRecord::Base
belongs_to :user
我在Activity中有一个方法:
def self.test_message(user, message)
user.activities << Activity.create do |activity|
activity.message = message
activity.added_at = Time.now
end
end
以及以下单元测试:
require 'test_helper'
class ActivityTest < ActiveSupport::TestCase
def test_test_message
#From fixture
alice = User.find_by_name("alice")
assert_equal 0, alice.activities.count
Activity.test_message(alice, "Hello")
assert_equal 1, alice.activities.count
Activity.test_message(alice, "Goodbye")
assert_equal 2, alice.activities.count
assert_equal "Hello", alice.activities.find(:first).message
#The following line fails with: Goodbye expected but was Hello
assert_equal "Goodbye", alice.activities.find(:last).message,
acts = alice.activities
assert_equal 2, acts.count
assert_equal "Goodbye", acts[1].message
end
end
在指定的行上失败了,但我找不到原因。
此外,使用activities.find(:last)在使用开发环境时仍然有效,但仅在测试环境下失败。我已经删除并重建了数据库。
答案 0 :(得分:0)
这似乎是在关联声明中使用:order标志的问题。这篇文章并不是您遇到的确切情况,但它建议反对这种做法:
http://weblog.jamisbuck.org/2007/1/18/activerecord-association-scoping-pitfalls
(我不确定这些建议是否仍然相关,但我在Rails 2.3.3中看到了与您相同的行为,直到我在下面进行了更改。)
我在本地设置了您的应用,并尝试通过添加
来应用评论#4中的技术def Activity.by_added_at
find :all, :order => 'added_at DESC'
end
并将测试中的find(:first)和find(:last)更改为.by_added_at.first和.by_added_at.last,返回更稳定的结果。
另一个建议 - 你的测试现在非常大。您可以考虑将其拆分为多个测试,每个测试最多测试一个或两个条件。