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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top