Почему find (: last) терпит неудачу в моих модульных тестах? - PullRequest
0 голосов
/ 01 октября 2009

У меня есть отношения один-ко-многим в 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

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

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

1 Ответ

0 голосов
/ 01 октября 2009

Похоже, это проблема с использованием флага: 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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...