Warum finden (: letzte) nicht in meinen Unit-Tests?
-
19-09-2019 - |
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.
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.