2010-10-22 8 views
8

यह समझें कि यह एक व्यापक प्रश्न की तरह लग सकता है - तो मुझे स्पष्टीकरण दें। मेरे पास एक इंटरफ़ेस के माध्यम से एक रेपॉजिटरी है, जिसमें दो ठोस कार्यान्वयन हैं - मॉक रिपोजिटरी और EntityFrameworkRepositoryरिपोजिटरी पर यूनिट-टेस्ट सीआरयूडी ऑपरेशंस को उचित तरीके से कैसे करें?

अब, मैं एक यूनिट टेस्ट मैचों की परियोजना है जिसके लिए सभी परीक्षणों के खिलाफ या तो भंडार चलाया जा सकता है है, [TestInitialize] में एक लाइन पर flicking के माध्यम से।

मेरा प्रश्न मूल रूप से "मुझे परीक्षण कैसे लिखना चाहिए"।

यहाँ मैं क्या है:

सी reate

// Arrange. 
var foo = new Foo { .. }; 

// Act 
Repository.Add(foo); 
UnitOfWork.Commit(); 

// Assert 
Assert.IsTrue(foo.Id > 0); 

आर etrieve

// Arrange. 
var fooToGet = 1; 

// Act 
var foo = Repository.FindSingle(fooToGet); 

// Assert 
Assert.IsNotNull(foo); 
Assert.AreEqual(foo.Id, fooToGet); 

यू pdate

// Arrange. 
var fooToGet = 1; 
var nameToChangeFooTo = "FooBar"; 

// Act 
var foo = Repository.FindSingle(fooToGet); 
foo.Name = nameToChangeFooTo; 
UnitOfWork.Commit(); 
var fooRetrievedAgain = Repository.FindSingle(fooToGet); 

// Assert 
Assert.IsNotNull(foo); 
Assert.AreEqual(fooRetrievedAgain.Id, fooToGet); 
Assert.AreEqual(fooRetrievedAgain.Name, nameToChangeFooTo); 

डी हटाएं

// Arrange. 
var fooToGet = 1; 

// Act 
var foo = Repository.FindSingle(fooToGet); 
Repository.Remove(foo); 
UnitOfWork.Commit(); 
var fooRetrievedAgain = Repository.FindSingle(fooToGet); 

// Assert 
Assert.IsNull(fooRetrievedAgain); 

यह दोनों नकली और EF भंडार के लिए ठीक काम कर रहा है, लेकिन मेरी मुख्य समस्या सी (बनाएं) है। मुझे यकीन नहीं है कि मेरे रिपोजिटरी पर एक ऐड ऑपरेशन का परीक्षण कैसे करें। यह सही महसूस कर रहा है जो मैं कर रहा हूं।

यह ईएफ रिपोजिटरी के लिए गुजरता है, लेकिन इसे मेरे मॉक रिपोजिटरी में पास करने के लिए मुझे इन-मेमोरी संग्रह (गंदा) में आईडी को अपडेट करने के लिए प्रतिबिंब का उपयोग करना पड़ा।

तो क्या आप कृपया कुछ सलाह साझा कर सकते हैं कि रिपोजिटरी पैटर्न पर सीआरयूडी संचालन का परीक्षण करने के सही तरीके क्या हैं?

यह एक एएसपी.नेट एमवीसी एप्लीकेशन, .NET 4, सी #, इकाई फ्रेमवर्क 4 और कार्य/रिपोजिटरी पैटर्न की इकाई है।

धन्यवाद।

संपादित

बस लोगों को स्पष्ट करने के लिए, निम्न सभी इकाई-परीक्षण मैं नहीं कर रहे हैं। मेरे पास मेरी सेवा परत के साथ-साथ व्यवसाय-नियम परीक्षणों के लिए यूनिट परीक्षण हैं।

यदि उपर्युक्त रिपोजिटरी परीक्षण विफल हो जाए तो बाद वाले दोनों (और चाहिए) विफल हो जाएंगे। यह बिंदु है, मेरे रेपॉजिटरीज़ के बहुत बुनियादी परिचालन यूनिट-परीक्षण करने के लिए। क्या मै गलत हु?

+0

आप यहां क्या परीक्षण कर रहे हैं? जैसे आप परीक्षण लिखने के लिए परीक्षण कर रहे हैं की बदबू आ रही है। – jfar

+0

@jfar - वास्तव में मैंने रिपॉजिटरीज़ (टीडीडी) लागू करने से पहले मैंने उन परीक्षणों को लिखा था। क्या आप कह रहे हैं कि आप अपने भंडारों का परीक्षण करने से परेशान नहीं हैं? व्यापार/सिस्टम परीक्षण में कितनी 'अर्थहीन' बग पाए जाएंगे, इस बारे में सोचें। एक ऐसा है जो एक सीआई निर्माण के साथ एक testrun के दौरान (और चाहिए) हाइलाइट किया जा सकता है। क्या आपको नहीं लगता? – RPM1984

+0

और याद रखें, मैं 'इंटरफेस' के माध्यम से परीक्षण कर रहा हूं। 'रिपोजिटरी' प्रकार 'आईआरपीओसेटरी 'प्रकार का है। तो मैं बस इतना करने का प्रयास कर रहा हूं कि मेरा रेस्पॉजिटरीज़ एक स्थिरता स्टोर पर मूल संचालन करने में सक्षम हैं (चाहे वह स्टोर इन-मेमोरी मॉक रेपो या ईएफ रिपोजिटरी हो)। – RPM1984

उत्तर

3

एक विकल्प अपने मैपिंग, प्रश्न और भंडार के व्यवहार का परीक्षण करने के लिए एसक्ललाइट जैसी इन-मेमोरी डीबी का उपयोग करना है। इस पर Ayende here द्वारा चर्चा की गई है, हालांकि उसका उदाहरण NHibernate का उपयोग करता है।

एक अन्य विकल्प जो डोमेन ऑब्जेक्ट्स के आईडी सेट करने की आपकी तत्काल चिंता को संबोधित करता है, परीक्षण झीलों का उपयोग करना है।RhysC here द्वारा इस पर चर्चा की गई है।

+0

मेरे प्रश्न को गलत समझने के बारे में सोचें। मेरे पास पहले से ही एक नकली रिपोजिटरी है, मैं पूछ रहा हूं कि मैं उन परीक्षणों को कैसे लिख सकता हूं जो नकली और असली रिपोजिटरी दोनों के खिलाफ गुजरना चाहिए। Ayende परीक्षण विधि को देखो। यही वह जानकारी है जो मैं चाहता हूं (परीक्षण को सही तरीके से कैसे लिखना है), वास्तविक कार्यान्वयन विवरण नहीं। – RPM1984

+1

यदि भंडार में कोई जटिल तर्क नहीं है और केवल अंतर्निहित स्टोर के लिए अनुरोध है।फिर एक राज्य आधारित व्यक्ति के बजाय एक इंटरैक्शन आधारित परीक्षण अधिक उपयुक्त हो सकता है। यानी रिपो में इंजेक्शन वाले स्टोर को मॉक करें। और जोर देकर कहा कि कुछ तरीकों को बुलाया गया था। डोमेन ऑब्जेक्ट आईडी के मान पर जोर देने की बजाय। – martinl

+0

स्वीकृत उत्तर के रूप में हम इन-मेमोरी परीक्षण के लिए एसक्ललाइट पर जा रहे हैं (भले ही यह एकीकरण है, – RPM1984

1

IMO, अपने बनाने के परीक्षण करना चाहिए:

  • एक इकाई भंडार
  • ज़ोर करने के लिए एक आईडी
  • जोड़ने यह सौंपा गया था आईडी
  • के साथ प्रारंभिक इकाई की तुलना का उपयोग कर डाला इकाई को पुनः प्राप्त पढ़ने इकाई और

मैं तुम्हारा मुख्य घ जैसे कई इकाई परीक्षण मिल गया है यकीन है कि उनके गुणों को एक ही कर रहे हैं अगर यह है कि मैं वस्तु उदाहरणों की तुलना करने के लिए एक गहरी तुलना विधि का उपयोग कर रहा हूं। उदाहरण के लिए, मेरी यू परीक्षण इस तरह दिखेगा:

  • भंडार करने के लिए एक इकाई जोड़ने
  • आईडी
  • परिवर्तन इकाई गुण से कुछ
  • अद्यतन भंडार में इकाई का उपयोग कर डाला इकाई को पुनः प्राप्त
  • आईडी
  • का उपयोग करके अद्यतन इकाई को पुनर्प्राप्त करें, अद्यतन इकाई के साथ अद्यतन इकाई की तुलना करें और सुनिश्चित करें कि उनकी गुण समान हैं (आप उन गुणों के लिए एक विशिष्ट तर्क परिभाषित कर सकते हैं जो अद्यतन नहीं हैं)
+0

दिलचस्प है। यद्यपि आपका यू (अपडेट) भी एक ऐड का परीक्षण करता है। क्या यह वास्तव में एक इकाई परीक्षण है? आपके बाकी यू परीक्षण समझ में आता है, लेकिन पहले इसे जोड़ने नहीं। आईएमओ एक अद्यतन परीक्षण में मौजूदा आइटम को पुनर्प्राप्त करना और फिर इसे अपडेट करना शामिल होना चाहिए। हालांकि आपका उत्तर (और विचार) का स्वागत है। धन्यवाद। – RPM1984

+1

मैं आपका बिंदु देखता हूं लेकिन यदि आप इकाई को सम्मिलित नहीं करते हैं, तो आपको पिछले राज्य पर भरोसा करना होगा जो कि उदाहरण के लिए क्लासइनिस्टाइज द्वारा बनाया गया हो सकता था। मैं वास्तव में परमाणु होने के लिए अपने परीक्षण पसंद करते हैं। साथ ही, ध्यान दें कि मैं सम्मिलित इकाई पर कुछ भी परीक्षण नहीं कर रहा हूं। –

+0

असल में हाँ यह एक महान बिंदु है। टेस्ट परमाणु होना चाहिए। – RPM1984

संबंधित मुद्दे