كيفية جعل التركيبات قابلة للتحديث في اختبارات ريلز؟
-
05-07-2019 - |
سؤال
أدناه أدرجت بعض التعليمات البرمجية من تطبيق Rails البسيط.فشل الاختبار المذكور أدناه في السطر الأخير، لأن تم التحديث في لم يتم تغيير حقل المنشور ضمن إجراء التحديث الخاص بـ PostController في هذا الاختبار.لماذا؟
يبدو لي هذا السلوك غريبًا بعض الشيء، نظرًا لأنه تم تضمين الطوابع الزمنية القياسية في نموذج النشر، اختبار مباشر على الخادم المحلي يُظهر أن هذا الحقل قد تم تحديثه فعليًا بعد العودة من إجراء التحديث وتم استيفاء التأكيد الأول وبالتالي يُظهر أن إجراء التحديث سار على ما يرام.
كيف يمكنني صنع التركيبات قابل للتحديث في المعنى أعلاه؟
# app/controllers/post_controller.rb
def update
@post = Post.find(params[:id])
if @post.update_attributes(params[:post])
redirect_to @post # Update went ok!
else
render :action => "edit"
end
end
# test/functional/post_controller_test.rb
test "should update post" do
before = Time.now
put :update, :id => posts(:one).id, :post => { :content => "anothercontent" }
after = Time.now
assert_redirected_to post_path(posts(:one).id) # ok
assert posts(:one).updated_at.between?(before, after), "Not updated!?" # failed
end
# test/fixtures/posts.yml
one:
content: First post
المحلول
posts(:one)
وهذا يعني "إحضار التركيبة المسماة ":one" في ملف post.yml.لن يتغير هذا أبدًا أثناء الاختبار، باستثناء بعض التعليمات البرمجية الغريبة والمدمرة للغاية والتي لا مكان لها في الاختبارات المعقولة.
ما تريد القيام به هو التحقق من الكائن الذي تقوم وحدة التحكم بتعيينه.
post = assigns(:post)
assert post.updated_at.between?(before, after)
نصائح أخرى
في ملاحظة جانبية إذا كنت تستخدم ينبغي (http://www.thinkbot.com/projects/shoulda/) انها تبدو مثل هذا:
context "on PUT to :update" do
setup do
@start_time = Time.now
@post = posts(:one)
put :update, :id => @post.id, :post => { :content => "anothercontent" }
end
should_assign_to :post
should "update the time" do
@post.updated_at.between?(@start_time, Time.now)
end
end
ينبغي أن يكون رائعا.