Почему find(:last) терпит неудачу в моих модульных тестах?

StackOverflow https://stackoverflow.com/questions/1504332

Вопрос

У меня есть отношения один-ко-многим в 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) работает при использовании среды разработки, но не работает только в тестовой среде.Я удалил и перестроил базу данных.

Это было полезно?

Решение

Кажется, это проблема с использованием флага :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, что возвращает более стабильные результаты.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top