Pourquoi trouver (: dernière) échouer dans mes tests unitaires?
-
19-09-2019 - |
Question
J'ai un à plusieurs dans Rails:
class User < ActiveRecord::Base
has_many :activities, :order => "added_at DESC"
class Activity < ActiveRecord::Base
belongs_to :user
J'ai une méthode à l'activité:
def self.test_message(user, message)
user.activities << Activity.create do |activity|
activity.message = message
activity.added_at = Time.now
end
end
et le test unitaire suivant:
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
qui échoue sur la ligne indiquée, mais je ne peux pas comprendre pourquoi.
En outre, en utilisant activities.find (: dernière) fonctionne en utilisant l'environnement de développement, mais échoue uniquement dans l'environnement de test. Je l'ai abandonné et reconstruit la base de données.
La solution
Cela semble être un problème avec l'aide du: drapeau de commande dans votre déclaration d'association. Ce poste n'est pas la situation exacte que vous rencontrez, mais il recommande de la pratique en général:
http://weblog.jamisbuck.org/2007 / 1/18 / activerecord-association-cadrage-pièges
(Je ne sais pas si ces suggestions sont toujours pertinentes, mais je voyais que vous le même comportement dans Rails 2.3.3 jusqu'à ce que je fait les changements ci-dessous.)
Je mis en place votre application localement et essayé d'appliquer la technique du commentaire n ° 4 en ajoutant
def Activity.by_added_at
find :all, :order => 'added_at DESC'
end
et changer votre find (: d'abord) et trouver (: dernière). Dans le test à .by_added_at.first et .by_added_at.last, qui renvoie des résultats plus stables
Une autre suggestion - votre test est assez grand moment. Vous pourriez envisager de le diviser en plusieurs essais sur, chacun teste une ou deux conditions au maximum.