2009-03-25 6 views
7

मैं कुछ .NET कक्षाओं का परीक्षण करने की कोशिश कर रहा हूं (अच्छे डिजाइन कारणों से) को उनके काम करने के लिए डीबीकनेक्शन की आवश्यकता होती है। इन परीक्षणों के लिए, मेरे पास इन कक्षाओं में इनपुट के रूप में देने के लिए स्मृति में कुछ डेटा है।स्रोत के रूप में इन-मेमोरी डेटासेट (या इसी तरह) के रूप में डीबी के बिना डीबीकनेक्शन

कि इन-मेमोरी डेटा को डेटाटेबल (या डेटासेट जिसमें डेटाटेबल शामिल है) के रूप में आसानी से व्यक्त किया जा सकता है, लेकिन यदि कोई और वर्ग अधिक उपयुक्त था तो मैं इसका उपयोग कर सकता था।

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

उत्तर

6

डीबीकनेक्शन का उपभोग करने के बजाय आप आईडीबीकनेक्शन का उपभोग कर सकते हैं और इसे नकली कर सकते हैं? हम कुछ ऐसा करते हैं, नकल को डेटासेट पास करते हैं। DataSet.CreateDataReader डेटाटेबल रीडर देता है जो DbDataReader से प्राप्त होता है।

हमने डीबीकनेक्शन को अपने स्वयं के आईडीबीकनेक्शन-जैसे इंटरफ़ेस में लपेट लिया है जिसमें हमने एक एक्जिक्यूटर() विधि जोड़ा है जो एक कक्षा को वापस करता है जो डीबीडेटा रीडर के समान इंटरफ़ेस लागू करता है। हमारे नकली में, ExecuteReader बस देता है जो DataSet.CreateDataReader सेवा करता है।

चौराहे की तरह लगता है, लेकिन संभवतः कई परिणामों के साथ डेटासेट बनाने के लिए बहुत सुविधाजनक है। हम संग्रहीत प्रोसेस के बाद डेटाटेबल्स का नाम देते हैं, जो वे परिणामों का प्रतिनिधित्व करते हैं, और हमारे आईडीबीकनेक्शन मॉक क्लाइंट कॉल कर रहे प्रोसेस के आधार पर दाएं डेटाटेबल को पकड़ लेता है। डेटाटेबल भी CreateDataReader लागू करता है ताकि हम जाने के लिए अच्छे हों।

0

TypeMock? (हालांकि आपको इसे 'इंस्टॉल' करना होगा)।

सावधान रहें कि डेटा * आपको परीक्षण के लिए उचित हुक दे सकता है - यह सामान्य रूप से सबसे खराब मामला है। लेकिन आप अच्छे डिजाइन कारण कहते हैं, इसलिए मुझे यकीन है कि सभी शामिल हैं: डी

3

एक दृष्टिकोण जो मैंने उपयोग किया है वह एक मेमोरी स्क्लाइट डेटाबेस बनाना है। यह केवल सिस्टम में खींचकर किया जा सकता है। डेटा। SQLite.Core NuGet पैकेज को आपके यूनिट टेस्ट प्रोजेक्ट में, आपको कहीं भी किसी भी सॉफ़्टवेयर को इंस्टॉल करने की आवश्यकता नहीं है।

हालांकि यह वास्तव में एक स्पष्ट विचार की तरह लगता है, यह तब तक नहीं था जब तक मैं डैपर यूनिट परीक्षणों को देख रहा था जिसे मैंने तकनीक का उपयोग करने के लिए सोचा था! में

https://github.com/StackExchange/dapper-dot-net/blob/bffb0972a076734145d92959dabbe48422d12922/Dapper.Tests/Tests.cs

एक बात "GetSqliteConnection" विधि देखें बारे में पता की है कि यदि आप एक में स्मृति SQLite db बना सकते हैं और बना सकते हैं और टेबल पॉप्युलेट, इससे पहले कि आप कनेक्शन नहीं बंद करने के लिए सावधान रहना चाहिए होने के लिए अपने परीक्षण प्रश्नों को निष्पादित करना क्योंकि एक नया इन-मेमोरी कनेक्शन खोलने से आपको नया इन-मेमोरी डेटाबेस, डेटाबेस से कनेक्शन मिलेगा, जिसे आपने अपने परीक्षणों के लिए सावधानी से तैयार किया है! मेरे कुछ परीक्षणों के लिए, मैं कस्टम आईडीबीकनेक्शन कार्यान्वयन का उपयोग करता हूं जो इस गड़बड़ी से बचने के लिए कनेक्शन को खुला रखता है - उदाहरण के लिए।

https://github.com/ProductiveRage/SqlProxyAndReplay/blob/master/Tests/StaysOpenSqliteConnection.cs

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