كيف يمكنني الجمعيات نموذج الإعداد في اختبار RSpec؟
-
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)])