2008-09-09 12 views
50

का उपयोग करते हैं लोग यूनिट परीक्षण कोड कैसे हैं जो लिंक से SQL का उपयोग करता है?लोग यूनिट परीक्षण कोड कैसे हैं जो लिंक से SQL

+0

मैं सिर्फ Linq2Sql साथ ASP.NET MVC बाहर कोशिश कर रहा हूँ और "टास्कलिस्ट" डेमो एप्लिकेशन के लिए कुछ यूनिट परीक्षण लिखने की कोशिश की। बहुत अजीब त्रुटियों में भागो, और फिर मैं इस पर ठोकर खाई। एक महान तकनीक ढेर को इतना आसान लगाना बहुत दुखद है। – willasaywhat

+0

यह देखने के लिए देखें कि LINQ से SQL के साथ प्रभावी ढंग से और सफलतापूर्वक परीक्षण कैसे करें: http://stackoverflow.com/questions/4128640/how-to-remove-unit-of-work- कार्यक्षमता-from-repositories-using- ioc/4132186 # 4132186 – Steven

+0

पर्याप्त क्वेरी-पार्ट्स हैं जो linq के साथ linq के साथ ठीक काम करते हैं जो linq से sql के साथ नहीं है। यह बहुत अच्छा होगा अगर हमारे पास वास्तव में SQL सर्वर के विरुद्ध चलने के बिना linq2sql संगतता का परीक्षण करने के लिए एक तंत्र था। (SQL सर्वर के लिए, अन्य डीबीएमएस के लिए कार्यान्वयन अन्य अभिव्यक्ति परिवर्तन का समर्थन कर सकता है)। जब आप क्वेरी स्पेस (फ़िल्टर, ट्रांसफॉर्मेशन, एग्रीगेशंस) को इकट्ठा करने के लिए अपने विशिष्टता पैटर्न या डीएसएल का परीक्षण करना चाहते हैं तो वास्तविक डीबी इंस्टेंस के खिलाफ परीक्षण चलाने का कोई विकल्प नहीं लगता है। या वहाँ है? – mbx

उत्तर

14

अद्यतन:

फ्रेड्रिक कैसे अपने ब्लॉग पर इकाई परीक्षण linq2sql अनुप्रयोगों से अधिक करने के लिए एक उदाहरण समाधान कर दिया गया है।

http://web.archive.org/web/20120415022448/http://iridescence.no/post/DataContext-Repository-Pattern-Example-Code.aspx

इतना ही नहीं करते हैं मुझे लगता है कि अपने महान है कि वह एक उदाहरण समाधान तैनात है, वह भी सभी वर्गों, जो डिजाइन और अधिक decoupled बनाता है के लिए इंटरफेस निकालने में कामयाब रहे: आप इसे पर डाउनलोड कर सकते हैं।

मेरे पुराने पोस्ट:

* मैं इन ब्लॉगों मुझे लगता है कि DataContext आवरण बनाने के लिए एक अच्छी शुरुआत कर रहे हैं पाया: Link1 Link2

वे लगभग एक ही विषय है कि पहले एक औजार को छोड़कर कवर टेबल के लिए इंटरफेस निकालने का मतलब है। दूसरा एक और अधिक व्यापक है, इसलिए मैंने इसे भी शामिल किया। *

+0

पहले लिंक पर वास्तविक पता गलत है, वास्तव में उपयोगी आलेख देखने के लिए पते को कॉपी और पेस्ट करें। –

+5

लिंक मृत होने लगते हैं – Ha11owed

+1

मैं उदाहरण कोड (ज़िप डाउनलोड भी काम करता है) और वे बैक मशीन पर लिंक 1 ढूंढने में सक्षम था, इसलिए वे लिंक अभी तय किए गए हैं। मैं लिंक 2 की कामकाजी प्रति नहीं ढूंढ पा रहा था। –

1

आम तौर पर, आपको LINQ से SQL का उपयोग करने वाले कोड के हिस्से की जांच करने की आवश्यकता नहीं है, लेकिन यदि आप वास्तव में चाहते हैं, तो आप उसी डेटा सेट का उपयोग कर सकते हैं जिसे आप सर्वर के विरुद्ध पूछताछ कर रहे हैं और उन्हें चालू कर सकते हैं -मेमरी ऑब्जेक्ट्स और उसके खिलाफ LINQ क्वेरी चलाएं (जो क्वेरी करने योग्य के बजाय संख्यात्मक विधियों का उपयोग करेगा)।

मैट वॉरेन के mockable version of the DataContext का उपयोग करने का एक और विकल्प है।

आप SQL कथन भी प्राप्त कर सकते हैं कि LINQ से SQL उन्हें डीबगर (IQueryable ऑब्जेक्ट से) के माध्यम से प्राप्त करके उपयोग करता है, मैन्युअल रूप से उनको जांचें, और फिर उन्हें स्वचालित परीक्षणों में शामिल करें।

+1

किसी को LINQ से SQL का उपयोग करने वाले कोड के भाग का परीक्षण करने की आवश्यकता क्यों नहीं है? मैं उदास हूँ एक एएसपीएनटी एमवीसी वेब पेज लिखना जहां कई नियंत्रक LINQ से SQL का उपयोग करते हैं और मुझे इन नियंत्रकों का परीक्षण करना पड़ता है ... –

+1

मेरा मतलब था कि आपको यह सुनिश्चित करने की आवश्यकता नहीं है कि LINQ से SQL स्वयं विज्ञापन के रूप में काम करता है (क्योंकि माइक्रोसॉफ्ट पहले से ही परीक्षण किया गया है वह आपके लिए) आपके कोड के विपरीत जो LINQ से SQL कक्षाओं के किसी भी परिणाम का उपयोग करता है। –

2

लिंकक परीक्षण को अधिक आसान बनाता है। लिंक पूछताछ लिंक-टू-एसक्यूएल सामान के रूप में सूचियों पर भी काम करती है। आप सूची वस्तुओं के लिए लिंक से एसक्यूएल को स्वैप कर सकते हैं और उस तरह से परीक्षण कर सकते हैं।

+0

समस्या विदेशी कुंजी संबंधों (EntitySet/EntityRef) और कॉलम जैसी चीजें हैं जहां 'IsDbGenerated = true' है। –

+0

आपको वास्तव में इस दृष्टिकोण से सावधान रहना होगा। लिंक से SQL और लिंक से ऑब्जेक्ट्स अलग-अलग प्रदाता हैं और कोई गारंटी नहीं है कि वे बिल्कुल वही काम करेंगे (और व्यवहार में, वे कभी-कभी नहीं करेंगे)। विशेष रूप से इस मामले में, जहां लिंक से एसक्यूएल लिंक के ऑब्जेक्ट्स का उप-समूह है। मैं रनटाइम असफलताओं के बाद कई हरे रंग के यूनिट परीक्षणों की भविष्यवाणी करता हूं। –

4

डेटाकॉन्टेक्स्ट लपेटें, फिर रैपर को नकली करें। इसे पूरा करने का सबसे तेज़ तरीका है, इसलिए इसे परीक्षण के लिए कोडिंग की आवश्यकता होती है, जो कुछ लोग गंध महसूस करते हैं। लेकिन कभी-कभी, जब आपके पास निर्भरताएं होती हैं जिन्हें आसानी से मजाक नहीं किया जा सकता है, तो यह एकमात्र तरीका है।

1

LINQ से SQL वास्तव में इकाई परीक्षण के लिए वास्तव में अच्छा है क्योंकि इसमें आपके डीबीएमएल में परिभाषित किए गए अनुसार उड़ान पर डेटाबेस बनाने की क्षमता है।

यह डाटाकॉन्टेक्स्ट के माध्यम से डीबी बनाकर और इसे शुरू करने के लिए खाली करके ओआरएम परत का परीक्षण करना वाकई अच्छा बनाता है।

मैं यहाँ अपने ब्लॉग पर इसे कवर: http://web.archive.org/web/20090526231317/http://www.aaron-powell.com/blog/may-2008/unit-testing-linq-to-sql.aspx

+0

इस लिंक में वर्तमान में –

+0

त्रुटियां हैं, मैंने लेखक की वर्तमान वेबसाइट पर एक नज़र डाली और उल्लिखित पद नहीं मिला। मैंने पिछले लिंक को तोड़ने के बाद से वे बैक मशीन से सबसे अच्छे मैच के साथ जवाब संपादित किया है। –

+0

हाँ, ऐसा लगता है कि वह समय समय के रेत (और एकाधिक माइग्रेशन) में खो गया है। लेकिन वास्तव में मैंने जिस समाधान का प्रस्ताव दिया है ** ** यूनिट परीक्षण नहीं है, यह एकीकरण परीक्षण है –

5

3 साल देर से, लेकिन यह कैसे मैं यह कर रहा है:

https://github.com/lukesampson/LinqToSQL-test-extensions/

एक आवरण लिखने या पाइपलाइन की बहुत सारी करने के लिए कोई ज़रूरत नहीं, बस अपने बगल में टी 4 टेम्पलेट ड्रॉप करें।डीबीएमएल और आपको मिलता है:

  1. आपके डेटा संदर्भ के लिए एक इंटरफ़ेस उदा। IExampleDataContext
  2. आपके डेटा संदर्भ के लिए एक इन-मेमोरी मैक उदा। MemoryExampleDataContext

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

तो तुम जैसे

public class ProductRepo { 
    IExampleDataContext DB { get; set }; 
    public ProductRepo(IExampleDataContext db) { 
     DB = db; 
    } 

    public List<Product> GetProducts() { 
     return DB.Products.ToList(); 
    } 
} 

कर सकते हैं और आप कॉल कर सकते हैं कि के साथ या तो

new ProductRepo(new MemoryExampleDataContext()).GetProducts(); // for testing 

या

new ProductRepo(new ExampleDataContext()).GetProducts(); // use the real DB 
संबंधित मुद्दे