2009-10-01 19 views
0

J'ai un à plusieurs dans Rails:Pourquoi trouver (: last) échouer dans mes tests unitaires?

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 suivante:

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.

De plus, l'utilisation de activities.find (: last) fonctionne lors de l'utilisation de l'environnement de développement, mais échoue uniquement dans l'environnement de test. J'ai laissé tomber et reconstruit la base de données.

+0

juste avant la ligne problématique, que signifie "puts alice.activities.inspect"? – Tony

+0

aussi, essayez de trier spécifiquement par "created_at" et voyez si vous avez le même problème – Tony

+0

vous n'avez pas à faire find (: first) ou find (: last), faites juste un alice.activities.first ou alice. activities.last =) – Staelen

Répondre

0

Cela semble être un problème avec l'utilisation de l'indicateur: order 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-scoping-pitfalls

(Je ne sais pas si ces suggestions sont toujours pertinentes, mais je voyais la même . comportement que vous 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 (: premier) et trouver (: dernier) dans le test à .by_added_at.first et .by_added_at.last, ce qui renvoie des résultats plus stables. Une autre suggestion - votre test est assez gros en ce moment. Vous pourriez envisager de le diviser en plusieurs tests, chacun testant au plus une ou deux conditions.

+0

Un grand merci, c'est réglé. Point noté à propos des tailles d'essai. –