Frage

Ich habe eine Eins-zu-Beziehung in Rails:

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


class Activity < ActiveRecord::Base
  belongs_to :user

Ich habe eine Methode in Aktivität:

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

und die folgende Einheit Test:

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

, die nicht auf der angegebenen Linie, aber ich kann nicht herausfinden, warum.

Auch mit activities.find (: letzten) funktioniert, wenn die Entwicklungsumgebung verwenden, aber nicht nur unter der Testumgebung. Ich habe fallen gelassen und die Datenbank neu aufgebaut.

War es hilfreich?

Lösung

Dies scheint ein Problem zu sein mit der Verwendung der: Um Flagge in Ihrem Verein Erklärung. Dieser Beitrag ist nicht die genaue Situation Sie erleben, aber es empfiehlt gegen die Praxis im Allgemeinen:

http://weblog.jamisbuck.org/2007 / 1/18 / active-Verband-Scoping-Fallen

(Ich bin nicht sicher, ob diese Vorschläge noch relevant sind, aber ich sah das gleiche Verhalten wie Sie in Rails 2.3.3, bis ich die Änderungen unten gemacht.)

setze ich Ihre Anwendung lokal auf und versuchte, die Technik von Kommentar # Anwendung 4 durch Hinzufügen

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

und Ändern find (: first) und finden (: letzte). Im Test .by_added_at.first und .by_added_at.last, die stabilere Ergebnisse liefert

Ein weiterer Vorschlag - Ihr Test ist jetzt ziemlich groß. Sie betrachten könnte es Aufspaltung in mehrere Tests aus, von denen jeder testet ein oder zwei Bedingungen höchstens.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top