سؤال

لقد كنت أحاول حل مشكلة لبضعة أسابيع الآن. أقوم بإجراء اختبارات RSPEC لتطبيق Rails الخاص بي ، وهم يعملون بشكل جيد باستثناء خطأ واحد لا يمكنني أن أبدو فيه.

  • أنا أستخدم MySQL مع محرك InnoDB.
  • لقد وضع config.use_transactional_fixtures = true في spec_helper.rb
  • أقوم بتحميل تركيبات الاختبار يدويًا مع الأمر rake spec:db:fixtures:load.
  • يتم كتابة اختبار RSPEC لعامل BackgroundRB ، ويختبر أن السجل يمكن أن يتم تحديث حالته (من خلال GEM State_Machine).

ها هي مشكلتي:

لدي نموذج يسمى Listings. يدعو اختبار RSPEC update_sold_items الطريقة داخل ملف يسمى listing_worker.rb. هذه الطريقة تستدعي listing.sell للحصول على سجل معين ، والذي يحدد عمود "الحالة" لسجل القائمة إلى "بيع". حتى الآن ، هذا كله يعمل بشكل جيد ، ولكن عندما update_sold_items الطريقة ينتهي ، فشل اختبار RSPEC الخاص بي هنا:

listing = Listing.find_by_listing_id(listing_id)
listing.state.should == "sold"

expected: "sold",
     got: "current" (using ==)

لقد كنت أحاول تتبع سبب عدم استمرار تغيير الدولة ، لكنني ضائع إلى حد كبير. فيما يلي نتيجة لبعض رمز التصحيح الذي وضعته في update_sold_items الطريقة أثناء الاختبار:

pp listing.state  # => "current"

listing.sell!
listing.save!

pp listing.state  # => "sold"

listing.reload

pp listing.state  # => "current"

لا أستطيع أن أفهم لماذا يحفظها على ما يرام ، ولكن بعد ذلك يعود إلى السجل الأصلي كلما اتصلت reload, ، أو Listing.find إلخ.

شكرًا على قراءة هذا ، ويرجى طرح أي أسئلة إذا لم أقم بتقديم معلومات كافية.

شكرا لمساعدتكم ، ناثان ب

ملاحظة: ليس لدي مشكلة في إنشاء سجلات جديدة لفئات أخرى ، واختبار هذه السجلات. يبدو أنها مشكلة فقط عندما أقوم بتحديث السجلات الموجودة بالفعل في قاعدة البيانات.

هل كانت مفيدة؟

المحلول

أظن ، مثل ناثان ، قضايا المعاملات. حاول وضع قائمة. سيؤدي ذلك إلى إخراجك من المعاملة بحيث تكون أي مكالمات إضافية إضافية غير فعالة.

بالإضافة إلى ذلك ، من خلال تشغيل أمر "الالتزام" ، يمكنك إيقاف الاختبار باستخدام تصحيح الأخطاء وفحص قاعدة البيانات من عميل آخر لمعرفة ما يجري.

الفرضية الأخرى ، إذا كانت تجربة المعاملة لا تسفر عن أي نتائج ، هي أنه ربما لا ينقذ النموذج الخاص بك في قاعدة البيانات. تحقق من سجلات الاستعلام الخاصة بك. (على وجه التحديد ابحث عن استعلام التحديث).

هذا النوع من القضايا نتن حقا! حظا طيبا وفقك الله!

نصائح أخرى

إذا كنت ترغب في التحقيق في ما لديك في DB أثناء إجراء الاختبارات ، فقد تجد هذا مفيدًا ...

لدي اختبار RSPEC حيث أقوم بحفظ @user.save ويعمل مثل السحر ، ولكن بعد ذلك أردت معرفة ما إذا كان قد تم حفظه حقًا في DB.

فتحت وحدة التحكم في Rails لبيئة الاختبار

rails c test

جرى

User.all

وكما هو متوقع لم تحصل على شيء

ركضت مواصفاتي التي تحتوي على:

user_attr_hash    = FactoryGirl.attributes_for(:user)
@user = User.new user_attr_hash
@user.save
binding.pry

اعتقدت أن إيقاف الاختبار بعد الحفظ يعني أنه استمر ، لكن هذا ليس هو الحال. يبدو أن الالتزام بالاتصال يتم إطلاقه لاحقًا (ليس لدي أي فكرة متى: ) هكذا ، كما يوحي Tim Harper ، عليك إطلاق النار على نفسك في وحدة التحكم Pry:

pry(#<RSpec::Core::ExampleGroup::Nested_1>)> User.connection.execute("COMMIT")

الآن ، إذا قمت بتشغيل user.all في وحدة التحكم في Rails ، يجب أن تراه ؛)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top