Pergunta

Eu tenho uma relação de um para muitos em Rails:

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


class Activity < ActiveRecord::Base
  belongs_to :user

Eu tenho um método em Atividade:

def self.test_message(user, message)
  user.activities << Activity.create do |activity|
    activity.message = message
    activity.added_at = Time.now
  end    
end

e o seguinte teste de unidade:

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

que falha na linha indicada, mas eu não posso trabalhar fora porque.

Além disso, usando activities.find (: última) funciona ao usar o ambiente de desenvolvimento, mas só não sob o ambiente de teste. I caíram e reconstruído o banco de dados.

Foi útil?

Solução

Este parece ser um problema com o uso do: Bandeira ordem na sua declaração de associação. Este post não é a situação exata que você está experimentando, mas recomenda contra a prática em geral:

http://weblog.jamisbuck.org/2007 / 1/18 / activerecord-associação-escopo-armadilhas

(Eu não tenho certeza se essas sugestões são relevantes ainda sou, mas eu estava vendo o mesmo comportamento que você no Rails 2.3.3 até que eu fiz as alterações abaixo.)

Eu configurar seu aplicativo localmente e tentou aplicar a técnica de comentário # 4, adicionando

def Activity.by_added_at
  find :all, :order => 'added_at DESC'
end

e mudar a sua find (: em primeiro lugar) e encontrar (: última). No teste para .by_added_at.first e .by_added_at.last, que retorna resultados mais estáveis ??

Uma outra sugestão - o teste é muito grande agora. Você pode considerar a divisão lo para fora em vários testes, cada um dos que testa uma ou duas condições, no máximo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top