كيف يمكنني الجمعيات نموذج الإعداد في اختبار RSpec؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

ولقد pastied المواصفات لقد كتبت عن وجهة نظر الردود / show.html.erb في تطبيق أنا أكتب كوسيلة لمعرفة RSpec. أنا لا تزال التعلم عن يسخر والإستئصال. هذا السؤال هو محدد في "ينبغي أن قائمة جميع التعليقات ذات الصلة" المواصفات.

ما أريده هو أن اختبار أن إظهار يعرض تعليقات وظيفة و. ولكن ما أنا لست متأكدا من كيفية إعداد هذا الاختبار ومن ثم يكون الاختبار أعاد قدما يجب أن يحتوي ( 'XYZ') البيانات. أي تلميحات؟ وأعرب عن تقديره أيضا اقتراحات أخرى! شكرا.

و--- تحرير

وبعض مزيد من المعلومات. لدي named_scope تطبيقها على تعليق من وجهة نظري (وأنا أعلم، وأنا فعلت ذلك قليلا الى الوراء في هذه الحالة)، لذلك @ post.comments.approved_is (صحيح). رمز pastied يستجيب مع الخطأ "طريقة غير محدد` approved_is "ل#"، الأمر الذي يجعل الشعور منذ قلت ذلك كعب تعليقات والعودة للتعليق. ما زلت غير متأكد، ومع ذلك، وكيفية التسلسل القيادي للبذرة بحيث @ post.comments.approved_is (صحيح) سيعود مجموعة من التعليقات.

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

المحلول

والإستئصال هو حقا وسيلة للذهاب هنا.

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

وهنا مثال كيف سيكون إعداد المواصفات في باسط بك ...

describe "posts/show.html.erb" do

  before(:each) do
    assigns[:post] = mock_post
    assigns[:comment] = mock_comment
    mock_post.stub!(:comments).and_return([mock_comment])
  end

  it "should display the title of the requested post" do
    render "posts/show.html.erb"
    response.should contain("This is my title")
  end

  # ...

protected

  def mock_post
    @mock_post ||= mock_model(Post, {
      :title => "This is my title",
      :body => "This is my body",
      :comments => [mock_comment]
      # etc...
    })
  end

  def mock_comment
    @mock_comment ||= mock_model(Comment)
  end

  def mock_new_comment
    @mock_new_comment ||= mock_model(Comment, :null_object => true).as_new_record
  end

end

نصائح أخرى

ولست متأكدا إذا كان هذا هو الحل الأفضل، لكنني تمكنت من الحصول على المواصفات لتمرير قبل الإستئصال فقط named_scope. فما استقاموا لكم فاستقيموا نقدر أي ردود فعل على هذا فضلا عن اقتراحات لإيجاد حل أفضل، نظرا هناك واحد.

  it "should list all related comments" do
@post.stub!(:approved_is).and_return([Factory(:comment, {:body => 'Comment #1', :post_id => @post.id}), 
                                      Factory(:comment, {:body => 'Comment #2', :post_id => @post.id})])
render "posts/show.html.erb"
response.should contain("Joe User says")
response.should contain("Comment #1")
response.should contain("Comment #2")

ونهاية

ويقرأ سيئة بعض الشيء.

هل يمكن أن تفعل شيئا مثل:

it "shows only approved comments" do
  comments << (1..3).map { Factory.create(:comment, :approved => true) }
  pending_comment = Factory.create(:comment, :approved => false)
  comments << pending_comments
  @post.approved.should_not include(pending_comment)
  @post.approved.length.should == 3
end

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

هل يمكن أن يكون أيضا مصنع ل: pending_comment، شيء من هذا القبيل:

Factory.define :pending_comment, :parent => :comment do |p|
  p.approved = false
end

وأما إذا كاذبة هو الافتراضي، هل يمكن أن تفعل الشيء نفسه ل: approved_comments

وأنا أحب نهج نيك. كان لي نفس المشكلة نفسي وكنت قادرا على القيام بما يلي. أعتقد mock_model ستعمل أيضا.

post = stub_model(Post)
assigns[:post] = post
post.stub!(:comments).and_return([stub_model(Comment)])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top