2009-10-01 2 views
0

У меня есть один к многим в Rails:Зачем находить (: последний) сбой в моих модульных тестах?

class User < ActiveRecord::Base 
    has_many :activities, :order => "added_at DESC" 


class Activity < ActiveRecord::Base 
    belongs_to :user 

У меня есть метод в деятельности:

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 

который терпит неудачу на указанная строка, но я не могу понять, почему.

Кроме того, использование activity.find (: last) работает при использовании среды разработки, но только не выполняется в тестовой среде. Я сбросил и перестроил базу данных.

+0

прямо перед проблематичной линией, что делает «puts alice.activities.inspect» print? – Tony

+0

также, попробуйте сортировать специально «created_at» и посмотрите, есть ли у вас такая же проблема – Tony

+0

, вам также не нужно искать (: сначала) или найти (: последний), просто выполните alice.activities.first или alice. activities.last =) – Staelen

ответ

0

Это похоже на проблему с использованием флага заказа в объявлении ассоциации. Это сообщение не точное положение вы столкнулись, но он рекомендует против практики в целом:

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 

и изменение находку (: сначала) и найти (: последний) в проверьте на .by_added_at.first и .by_added_at.last, что возвращает более стабильные результаты.

Еще одно предложение - ваш тест довольно большой прямо сейчас. Вы можете рассмотреть возможность разделения на несколько тестов, каждый из которых проверяет не более одного или двух условий.

+0

Большое спасибо, это отсортировано. Точка отметила размеры теста. –

Смежные вопросы