كيفية جعل التركيبات قابلة للتحديث في اختبارات ريلز؟

StackOverflow https://stackoverflow.com/questions/1402556

سؤال

أدناه أدرجت بعض التعليمات البرمجية من تطبيق 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

ينبغي أن يكون رائعا.

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