لماذا تجد (: آخر) تفشل في اختبارات وحدتي؟
-
19-09-2019 - |
سؤال
لدي علاقة واحدة في القضبان:
class User < ActiveRecord::Base
has_many :activities, :order => "added_at DESC"
class Activity < ActiveRecord::Base
belongs_to :user
لدي طريقة في النشاط:
def self.test_message(user, message)
user.activities << Activity.create do |activity|
activity.message = message
activity.added_at = Time.now
end
end
واختبار الوحدة التالية:
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
الذي فشل في الخط المشار إليه، لكنني لا أستطيع العمل لماذا.
أيضا، باستخدام الأنشطة. يعمل (: LAST) يعمل عند استخدام بيئة التطوير، ولكن فشل فقط في ظل بيئة الاختبار. لقد سقطت وإعادة بنائها قاعدة البيانات.
المحلول
يبدو أن هذه مشكلة باستخدام علامة: طلب الطلب في إعلان جمعية الخاص بك. هذا المنصب ليس الوضع الدقيق الذي تواجهه، لكنه يوصي بممارسة العملية بشكل عام:
http://weblog.jamisbuck.org/2007/1/18/activerecord-association-scoping-pitalls.
(لست متأكدا مما إذا كانت هذه الاقتراحات لا تزال ذات صلة، لكنني أرى نفس السلوك كما كنت في القضبان 2.3.3 حتى تصنع التغييرات أدناه.)
أقضيت تطبيقك محليا وحاول تطبيق التقنية من التعليق رقم 4 عن طريق إضافة
def Activity.by_added_at
find :all, :order => 'added_at DESC'
end
وتغيير بحثك (: أولا) والعثور على (: آخر) في الاختبار إلى .by_added_at.first و .by_added_at.last، والتي ترجع نتائج أكثر استقرارا.
اقتراح واحد آخر - اختبارك كبير جدا الآن. قد تفكر في تقسيمها إلى اختبارات متعددة، كل منها يختبر شرطين أو حالتين على الأكثر.