एक स्टब/मॉक करने के लिए कब और कब नहीं जब मैं टीडीडी/बीडीडी विकास पैटर्न की ओर बढ़ने के लिए अपने सिर को रुपेक के चारों ओर लपेटने के लिए एक ठोस प्रयास कर रहा हूं। हालांकि, मैं कुछ बुनियादी सिद्धांतों से दूर हूं और संघर्ष कर रहा हूं:एक परीक्षण
पसंद है, जब मुझे मोक्स/स्टब्स का उपयोग करना चाहिए और मुझे कब नहीं करना चाहिए? उदाहरण के लिए
लें इस परिदृश्य: मैं एक Site
मॉडल है कि has_many :blogs
और Blog
मॉडल has_many :articles
है। मेरे Site
मॉडल में मेरे पास एक कॉलबैक फ़िल्टर है जो प्रत्येक नई साइट के लिए ब्लॉग और आलेखों का एक डिफ़ॉल्ट सेट बनाता है। मैं उस कोड का परीक्षण करना चाहता हूं, इसलिए यहां जाता है:
describe Site, "when created" do
include SiteSpecHelper
before(:each) do
@site = Site.create valid_site_attributes
end
it "should have 2 blogs" do
@site.should have(2).blogs
end
it "should have 1 main blog article" do
@site.blogs.find_by_slug("main").should have(1).articles
end
it "should have 2 secondary blog articles" do
@site.blogs.find_by_slug("secondary").should have(2).articles
end
end
अब, यदि मैं वह परीक्षण चलाता हूं, तो सब कुछ गुजरता है। हालांकि, यह भी एक बहुत ही धीमी है क्योंकि यह एक नई साइट, दो नए ब्लॉग और तीन नए लेख बना रहा है - प्रत्येक परीक्षण के लिए! तो मुझे आश्चर्य है, क्या यह स्टब्स का उपयोग करने के लिए एक अच्छा उम्मीदवार है? आइए इसे जाने दें:
describe Site, "when created" do
include SiteSpecHelper
before(:each) do
site = Site.new
@blog = Blog.new
@article = Article.new
Site.stub!(:create).and_return(site)
Blog.stub!(:create).and_return(@blog)
Article.stub!(:create).and_return(@article)
@site = Site.create valid_site_attributes
end
it "should have 2 blogs" do
@site.stub!(:blogs).and_return([@blog, @blog])
@site.should have(2).blogs
end
it "should have 1 main blog article" do
@blog.stub!(:articles).and_return([@article])
@site.stub_chain(:blogs, :find_by_slug).with("main").and_return(@blog)
@site.blogs.find_by_slug("main").should have(1).articles
end
it "should have 2 secondary blog articles" do
@blog.stub!(:articles).and_return([@article, @article])
@site.stub_chain(:blogs, :find_by_slug).with("secondary").and_return(@blog)
@site.blogs.find_by_slug("secondary").should have(2).articles
end
end
अब सभी परीक्षण अभी भी पास हो गए हैं, और चीजें थोड़ा तेज भी हैं। लेकिन, मैंने अपने परीक्षणों की लंबाई दोगुनी कर दी है और पूरा अभ्यास मुझे पूरी तरह से व्यर्थ मानता है, क्योंकि अब मैं अपने कोड का परीक्षण नहीं कर रहा हूं, मैं बस अपने परीक्षणों का परीक्षण कर रहा हूं।
अब, या तो मैं पूरी तरह से mocks/स्टब्स की बात नहीं छूटा है, या मैं उसे मौलिक रूप से गलत आ रहा हूँ, लेकिन मैं आशा करती हूं कि किसी को या तो कर सकता है:
- में सुधार मेरे ऊपर परीक्षण इसलिए यह उन तरीकों से स्टब्स या मैक्स का उपयोग करता है जो वास्तव में मेरे परीक्षणों के बजाए मेरे कोड का परीक्षण करते हैं।
- या, मुझे बताएं कि मुझे यहां स्टब्स का उपयोग करना चाहिए - या वास्तव में यह पूरी तरह से अनावश्यक है और मुझे इन मॉडलों को परीक्षण डेटाबेस में लिखना चाहिए।
धन्यवाद, यह एक सहायक प्रतिक्रिया है। :) – aaronrussell