كيفية إدراج معرفات يمكن التنبؤ بها لاختبار باستخدام أكتيفيريكورد
-
21-08-2019 - |
سؤال
وأنا أحاول القيام ببعض التجارب الخيار كما يلي:
Given I am logged in as admin
When I go to the article page
Then I should see "Edit Article"
And I should see "Article Title"
وحيث المسار إلى صفحة المادة هو "المواد / 1" أو بعض id.The مشكلة معروفة هو أنه عندما أقوم بإدخال البيانات الخاصة بي باستخدام تعريفي خطوة
Article.create(:name => "Article Title")
وأنا لا يمكن أن تعرف في وقت مبكر ما هوية ستكون عند إدخال السجل.
وأساسا، I إما الحاجة
وأ) أن يكون قادرا على إدراج هويات يمكن التنبؤ بها. لقد حاولت الطريقة المذكورة في الجواب في هذه المسألة ولكن لا توجد الآن 'ر يبدو أن العمل بالنسبة لي - دائما إدراج هوية مختلفة
أو
وب) إرسال الخطوات خيار لي في مثل هذه الطريقة التي يمكنني تمرير في معلمة لبلدي معرف المقالة
وكل الدروس الخيار رأيت نوعا من اللمعان على هذا النوع من السيناريو - انها تسير دائما إلى قائمة جميع المقالات أو أيا كان، أبدا صفحة تفاصيل محددة
وسيكون موضع تقدير أي مساعدة. شكرا!
المحلول
وهناك طريقتان لإنشاء قيم ID يمكن التنبؤ بها. الأول هو لتعيين معرف على يدويا إنشاء:
model = Model.new(options)
model.id = DESIRED_ID
model.save
والصيد هنا هو أن الخيارات التي تم تمريرها إلى إما جديدة أو إنشاء، أو سوف update_attributes لن يؤثر على قيمة id وهذا هو السبب في الدعوة إلى model.id هي، للأسف، المطلوبة.
وبديل ذلك هو لإعادة الجدول بأكمله قبل تشغيل الاختبارات الخاصة بك. ويمكن تغيير هذا لحساب التركيبات إذا لزم الأمر. على سبيل المثال:
class Model < ActiveRecord::Base
def self.reset!
connection.execute("DELETE FROM #{table_name}")
connection.execute("ALTER TABLE #{table_name} AUTO_INCREMENT=1")
end
end
وهذا سيحدد هوية من الصف الأول المدرج، على أن يكون قابل للتنبؤ 1.
نصائح أخرى
وماذا عن الانتقال إلى صفحة المادة في الطريق فإن المستخدم نفعل ذلك؟ خطوتك
When I go to the article page
ويمكن تغييره إلى
When I go to the page for the "Article Title" article
ووتعريف خطوتك يذهب إلى لمحة عامة عن المادة، يجد صلة مع "عنوان المقال" وانتقاله إلى الصفحة بهذه الطريقة.
ويمكنك الحصول على المزيد من التغطية الاختبار، وليس لديهم ما يدعو للقلق معرفات.
وماذا عن اتخاذ "انتقل إلى صفحة المقال" الذهاب إلى "/ المواد / # {Article.first.id}"
وهذا هو ما يمكنني استخدام:
# feature
Scenario: creator archives fragment
When fragment 1 exists
And I am the fragment owner
And I am on fragment 1
#steps
def create_fragment(attribs)
force_id = attribs[:force_id]
attribs.delete(:force_id) if force_id
fragment = Fragment.create!({ :owner_id => @current_user.id, :originator_id => @current_user.id}.merge(attribs))
if force_id
fragment.id = force_id.to_i
fragment.save!
end
fragment
end
When /^fragment (.*) exists$/ do |frag|
@fragment = Fragment.find_by_id(frag)
@fragment.destroy if @fragment
@fragment = create_fragment(:force_id => frag.to_i,:description => "test fragment #{frag}",:narrative => "narrative for fragment #{frag}")
end
# paths.rb
when /fragment (.*)/
fragment_path($1)
والمتعة.