2008-11-28 13 views
70

के साथ यूनिट परीक्षण मैं अपनी संस्थाओं का परीक्षण करना चाहता हूं जो इकाई फ्रेमवर्क का उपयोग करके बनाए गए हैं। मेरी चिंता यह है कि एंटिटी फ्रेमवर्क का उपयोग सीधे डेटा स्रोत के साथ काम करना है। तो किसी भी विचार इकाई इकाई इकाई फ्रेमवर्क आधारित घटकों को कैसे परीक्षण करें?इकाई फ्रेमवर्क

+0

संभावित डुप्लिकेट [एंटीटी फ्रेमवर्क 6 के साथ लोगों की इकाई परीक्षण कैसे करें, क्या आपको परेशान होना चाहिए?] (Https://stackoverflow.com/questions/22690877/how-are-people-unit-testing -साथ-इकाई-ढांचे -6-चाहिए-आप-परेशान) – Liath

उत्तर

51

Enity फ्रेमवर्क 4 के लिए, इस होनहार लग रहा है: Testability and Entity Framework 4.0

+0

अब इसे पढ़ने के लिए जा रहे हैं। बहुत से ईएफ परीक्षण प्रश्न और उत्तर अद्यतित नहीं हैं, इसलिए ईएफ 4.0 लिंक के लिए +1। – StuperUser

+1

हमारी दुकान यहां देखी गई तकनीकों को लागू करना शुरू कर रही है, और यह अब तक उत्तर की तरह दिखती है। –

+3

एफवाईआई, वह यूनिटऑफवर्क कक्षाओं में संदर्भ का निपटान कभी नहीं करता है। इस उदाहरण में, http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc- अनुप्रयोग, यूनिटऑफवर्क कक्षा लागू करने योग्य है। दो दृष्टिकोणों को संयोजित करें और हंस के जवाब में IUnitOfWork इंटरफ़ेस को IDISposible के साथ सजाने और निपटान पैटर्न को लागू करें उदा। http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.71).aspx –

-1

एक नकली ढांचे का उपयोग करने के बारे में कैसे? ऐसा लगता है कि एक मॉकिंग फ्रेमवर्क आपको डेटाबेस से अपने व्यावसायिक तर्क को अलग करने में मदद कर सकता है।

2

मैं मानता हूं कि एक मॉकिंग फ्रेमवर्क वह है जो आप कर रहे हैं। आप "मॉक" ऑब्जेक्ट्स बनाते हैं जिन्हें आपके डेटासोर्स से पुनर्प्राप्त नहीं किया जाता है, और आप उस ऑब्जेक्ट में डेटा का परीक्षण करते हैं। मैं व्यक्तिगत रूप से मोक के साथ काम कर रहा हूं, और मुझे यह पसंद है - राइनोमॉक्स भी हैं, साथ ही अन्य।

4

आप असली डेटा को मारने के बजाय नकली मान पुनर्प्राप्त करने के लिए एक मॉकिंग फ्रेमवर्क का उपयोग करना चाहते हैं।

यहाँ कर रहे हैं कि कैसे आरंभ करने के लिए पर कुछ स्क्रीनकास्ट: यहाँ कुछ मजाक चौखटे और कुछ स्क्रीनकास्ट के लिए लिंक की एक सूची मदद से आप आरंभ करने के लिए कर रहे हैं :

+8

आप आसानी से ईएफ के साथ ऐसा नहीं कर सकते हैं। आपका उत्तर इंटरफेस या विस्तार योग्य पीओसीओ के लिए सही है। – Will

3

हालांकि उदाहरण बहुत साधारण हो सकता है मैं यह बहुत ही इस मुद्दे को एक संभव समाधान पर चर्चा करने का प्रयास किया है। इसमें चिंताओं और हमारे प्रिय मित्र निर्भरता इंजेक्शन को अलग करना शामिल है।

http://devblog.petrellyn.com/

मुझे संपर्क आप अधिक विवरण चाहते हैं।

4

मैं इस पर एक और इनपुट साझा करना चाहता हूं। मैं TypeMock Isolator का उपयोग करके एंटीटी फ्रेमवर्क आधारित घटकों और एप्लिकेशन का परीक्षण करने में सक्षम था। हालांकि यह वाणिज्यिक है।

इस पोस्ट पर एक नज़र डालें: तथ्य यह है कि इकाई की रूपरेखा के संस्करण 1 में कुछ प्रमुख सॉफ्टवेयर डिजाइन सिद्धांतों को तोड़ता के कारण Introducing Entity Framework Unit Testing with TypeMock Isolator

+1

यह बहुत ही वाणिज्यिक है! – BritishDeveloper

4

, वहाँ वास्तव में जब यह इन का उपयोग कर TDD लागू करने के लिए किसी भी तरह से नहीं है आपका आवेदन। यदि आप तत्काल समाधान की तलाश में हैं तो मेरा शोध NHibernate को इंगित करता है। यह इकाई परीक्षण के साथ दिमाग में डिजाइन किया गया था। Test-Driven Development Walkthrough with the Entity Framework 4.0

0

BookLibrary नमूना

हालांकि, अगर आप इंतजार कर सकते हैं, वहाँ इकाई की रूपरेखा की अगली फिल्म के लिए आशा प्रतीत होता है WPF Application Framework (WAF) प्रोजेक्ट से पता चलता है कि एक इकाई फ्रेमवर्क आधारित एप्लिकेशन यूनिट परीक्षण कैसे किया जा सकता है।

6

एक सस्ता तरीका डेटाबेस फ़ाइल को अपने वास्तविक डेटाबेस के समान संरचना के साथ सेट करना है और उस पर इंगित करने के लिए अपनी इकाई परीक्षण कॉन्फ़िगरेशन में कनेक्शन स्ट्रिंग सेट करना है। डेटाबेस में उन सभी टेबलों की आवश्यकता नहीं है जो वास्तविक हैं; सिर्फ यूनिट परीक्षण की जरूरत है।

एक नुकसान यह है कि आपको डेटाबेस की स्थिति का प्रबंधन करने की आवश्यकता है ताकि यूनिट परीक्षण एक-दूसरे को या स्वयं के दौरान और बीच में प्रभावित न हों।

मुझे पता है कि यह दृष्टिकोण काम करता है जब असली और यूनिट परीक्षण डीबी एसक्यूएल एक्सप्रेस का उपयोग करते हैं, लेकिन मुझे पूर्ण एसक्यूएल डीबी के लिए एसक्लएक्सप्रेस डीबी में स्टबिंग करने के बारे में पता नहीं है।

मुझे एहसास है कि यह तकनीकी रूप से एकीकरण परीक्षण है, लेकिन यह आपके कोड को दोबारा करने या मॉकिंग फ्रेमवर्क सीखने से सस्ता हो सकता है।

उदाहरण वास्तविक कनेक्शन स्ट्रिंग:

<add name="DrinksEntities" 
    connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient 
    ;provider connection string=&quot;Data Source=localhost\sqlexpress;Initial Catalog=Drinks2;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" /> 

उदाहरण इकाई परीक्षण कनेक्शन स्ट्रिंग:

<add name="DrinksEntities" 
    connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient 
    ;provider connection string=&quot;Data Source=.\SQLEXPRESS;attachdbfilename=|DataDirectory|\Inventory.mdf;Integrated Security=True;user instance=True;MultipleActiveResultSets=True;Application Name=EntityFramework&quot;" 
    providerName="System.Data.EntityClient" /> 
+0

मुझे सस्ता पसंद है:) ... एक आकर्षण की तरह काम करता है :)! – Kiril

+4

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

+2

अपना डेटा सेट करना काफी आसान है - यूनिट परीक्षण संग्रहीत प्रक्रियाओं के लिए माइक्रोसॉफ्ट के सुझावों पर पढ़ें। वही प्रिंसिपल लागू होता है - आप एक लेनदेन शुरू करते हैं, टेबल को छोटा करते हैं, और आपको आवश्यक टेस्ट डेटा डालें; फिर परीक्षण चलाएं और आखिरकार लेनदेन को रोलबैक करें। डीबी उस राज्य में समाप्त होता है जिसकी शुरुआत हुई थी और आप प्रत्येक परीक्षण के लिए अपना परीक्षण डेटा प्रबंधित कर सकते हैं। – gbjbaanb

0

यहाँ काम पैटर्न की इकाई के एकीकरण का है + में स्मृति डेटाबेस + टी -4 कोड पीढ़ी स्वचालित रूप से उत्पन्न करने के लिए एक नकली ईएफ डीबीकॉन्टेक्स्ट।

http://mockingcompetence.wordpress.com/2013/05/20/fakingefdatacontext/

वहाँ वास्तव में इस समय कोई वास्तविक एफई db कनेक्शन नकल के साथ कुछ मुद्दों (एफई प्रश्नों का अवैध LINQ और कोई FK प्रवर्तन) कर रहे हैं।

हालांकि, टीडीडी या किसी अन्य प्रकार के यूनिट परीक्षण केंद्रित दृष्टिकोण को करने में सक्षम होने के लिए यूनिट परीक्षणों को जल्दी से चलाने के लिए इन-मेमोरी संदर्भ होना आवश्यक है।

मैं उपर्युक्त लिंक पर अपडेट पोस्ट कर रहा हूं क्योंकि मुझे अधिकतर मुद्दों का पता चलता है।

2

इसके साथ बहुत निराशा के बाद मुझे अंत में एक समाधान है कि मैं समस्या के कम से कम हिस्से के लिए खुश हूं।

public interface IRepository 
{ 
    IQueryable<T> GetObjectSet<T>(); 
} 

जो हम या तो एक स्मृति में संग्रह या कोई वास्तविक डीबी समर्थित संग्रह वापस जाने के लिए उपयोग कर सकते हैं:

पहले की तरह एक रिपोजिटरी इंटरफ़ेस कुछ का उपयोग करें। इसके बाद एक प्रश्न ऑब्जेक्ट में एक क्वेरी ऑब्जेक्ट में अपने प्रश्नों को समाहित करें जो इस तरह कुछ दिखता है।

public interface IQuery<T> 
{ 
    IQueryable<T> DoQuery(IQueryable<T> collection); 
} 

अब अपने यूनिट परीक्षणों को 2 समूहों में विभाजित करें। पहला समूह परीक्षण करेगा कि आपके प्रश्न मान्य हैं।इसलिए इस तरह कार्य करें:

[TestMethod] 
public void TestQueryFoo() 
{ 
    using(var repo = new SqlRepository("bogus connection string")) 
    { 
     var query = new FooQuery(); // implements IQuery<Foo> 
     var result = query.DoQuery(repo.GetObjectSet<Foo>()); // as long as we don't enumerate the IQueryable EF won't notice that the connection string is bogus 
     var sqlString = ((System.Data.Objects.ObjectQuery)query).ToTraceString(); // This will throw if the query can't be compiled to SQL 
    } 
} 

इकाई परीक्षण, जहाँ हम सबसे मुसीबत में पड़ तो स्वतंत्र रूप से, एसक्यूएल संकलन कदम है जिसके बारे में चिंता किए बिना अपने व्यापार तर्क परीक्षण कर सकते हैं अब तक के दूसरे सेट।

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

+0

क्या आप इस दृष्टिकोण का उपयोग कर कुछ नमूना कोड प्रदान कर सकते हैं? मैं यूनिट परीक्षण करना चाहता हूं जो एक वेब एपीआई 2 प्रोजेक्ट है जो इकाई फ्रेमवर्क का उपयोग कर रहा है –

0

आप अपने एंटिटी फ्रेमवर्क मॉडल का परीक्षण करने के लिए इन-मेमोरी डेटा बेस का उपयोग कर सकते हैं। अधिक जानकारी के लिए here देखें

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