¿Por qué buscar (: pasado) fallar en mis pruebas de unidad?
-
19-09-2019 - |
Pregunta
Tengo una relación de uno a muchos en rieles:
class User < ActiveRecord::Base
has_many :activities, :order => "added_at DESC"
class Activity < ActiveRecord::Base
belongs_to :user
Tengo un método de Actividad:
def self.test_message(user, message)
user.activities << Activity.create do |activity|
activity.message = message
activity.added_at = Time.now
end
end
y la prueba siguiente unidad:
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 se falla en la línea indicada, pero no puedo entender por qué.
Además, el uso activities.find (: pasado) funciona cuando se utiliza el entorno de desarrollo, pero sólo produce un error en el entorno de prueba. He caído y reconstruido la base de datos.
Solución
Esto parece ser un problema con el uso de la bandera orden en su declaración de asociación. Este post no es la situación exacta que está experimentando, pero no recomienda la práctica en general:
http://weblog.jamisbuck.org/2007 / 1/18 / activerecord-asociación-de alcance-trampas
(no estoy seguro de si estas sugerencias son todavía relevantes, pero que estaba viendo el mismo comportamiento que usted en los carriles 2.3.3 hasta que hice los cambios a continuación.)
I fijó su aplicación a nivel local y trató de aplicar la técnica del comentario # 4 añadiendo
def Activity.by_added_at
find :all, :order => 'added_at DESC'
end
y cambiando su hallazgo (: en primer lugar) y encontrar (: pasado). En la prueba de .by_added_at.first y .by_added_at.last, que devuelve resultados más estables
Otra sugerencia - la prueba es bastante grande en este momento. Podría considerar dividir a cabo en varias pruebas, cada una de las cuales pone a prueba una o dos condiciones como máximo.