2009-02-22 9 views
34

मैं इकाई परीक्षण ADO नेट इकाई की रूपरेखा के खिलाफ लिखे कोड हूं। मैं पंक्तियों के साथ एक इन-मेमोरी डेटाबेस पॉप्युलेट करना चाहता हूं, और यह सुनिश्चित कर लें कि मेरा कोड उन्हें ठीक से पुनर्प्राप्त कर सके।क्या इकाई फ्रेमवर्क के लिए एक मेमोरी प्रदाता है?

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

उदाहरण के लिए:

class CustomerService 
{ 
    ObjectQuery<Customer> _customerSource; 
    public CustomerService(ObjectQuery<Customer> customerSource) 
    { 
     _customerSource = customerSource; 
    } 
    public Customer GetCustomerById(int customerId) 
    { 
     var customers = from c in _customerSource.Include("Order") 
      where c.CustomerID == customerId 
      select c; 
     return customers.FirstOrDefault(); 
    } 
} 

अगर मैं नकली ObjectQuery आदेश के साथ आबादी वाले एक ज्ञात ग्राहक वापस जाने के लिए, मुझे कैसे पता customerservice सही जहां खंड और शामिल है कि करते हैं? मैं कुछ ग्राहक पंक्तियों और कुछ ऑर्डर पंक्तियों को डालने के बजाय, सही ग्राहक का चयन किया गया था और आदेश आबादी वाले हैं।

+1

जैसे आप समाप्त कर चुके हैं, मैंने रिपोजिटरी पैटर्न और यूनिट ऑफ वर्क पैटर्न का पालन करने के लिए इंटरफेस का उपयोग किया है। फिर, मेरे पास दो नामस्थान हैं -> ईएफ और नकली। मेरे नकली भंडार के साथ, मैंने अपनी सामग्री को स्टोर करने के लिए आईएलआईस्ट का उपयोग किया और डेटा निकालने के लिए ऑब्जेक्ट्स के लिए लिंक को लीवरेज किया। महान काम करता है :) –

+4

EntityFramework 7 में अब इनमोमोरी प्रदाता है। अभी भी टिप्पणी के रूप में बीटा लेकिन यदि आप रात की नींद की सदस्यता लेते हैं तो आप इसे प्राप्त कर सकते हैं। – ppumkin

उत्तर

7

वर्तमान में एफई के लिए एक स्मृति में प्रदाता नहीं है, लेकिन अगर आप Highway.Data पर एक नज़र डालें यह एक आधार अमूर्त अंतरफलक और एक InMemoryDataContext है।

Testing Data Access and EF with Highway.Data

+8

यह अब सही उत्तर नहीं है। ईएफ 7 अब इनमेमरी का समर्थन करता है ... ठीक है, जब इसे इतने दूर के भविष्य में रिलीज़ नहीं किया जाता है। – ppumkin

+3

यह इस लेखन के रूप में बीटा में है। NuGet पर EntityFramework.InMemory की तलाश करें। – HiredMind

+0

जबकि ईएफ 7 में एक इनमेमरी प्रदाता शामिल होगा ... यह मेरी समझ है कि इनमेमरी प्रदाता अत्यधिक संक्षेप में है कि यह सभी प्रदाताओं की सामान्य विशेषताओं की नकल करता है। आपको इकाई परीक्षणों के लिए EntityFramework.SqlLite प्रदाता जैसे कुछ उपयोग करने की आवश्यकता होगी जिसके लिए कुछ प्रदाता-विशिष्ट अवधारणाओं के सत्यापन की आवश्यकता होती है। उदाहरण के लिए, मैं इनमेमरी प्रदाता का उपयोग कर अद्वितीय बाधाओं या आवश्यक फ़ील्ड बाधाओं को सत्यापित करने में सक्षम नहीं था। आप इसके साथ संबंधपरक बाधाओं को भी मान्य नहीं कर सकते हैं। यहां अधिक जानकारी: https://github.com/aspnet/EntityFramework/issues/2166 – Paul

2

मैं इकाई की रूपरेखा और ObjectQuery वर्ग से परिचित नहीं हूँ, लेकिन अगर शामिल करें विधि आभासी है तो आप इसे इस नकली कर सकते हैं:

// Arrange 
var customerSourceStub = MockRepository.GenerateStub<ObjectQuery<Customer>>(); 
var customers = new Customer[] 
{ 
    // Populate your customers as if they were coming from DB 
}; 
customerSourceStub 
    .Stub(x => x.Include("Order")) 
    .Return(customers); 
var sut = new CustomerService(customerSourceStub); 

// Act 
var actual = sut.GetCustomerById(5); 

// Assert 
Assert.IsNotNull(actual); 
Assert.AreEqual(5, actual.Id); 
+0

GetCustomerById विधि की दो विशेषताएं हैं: जहां खंड, और शामिल हैं। यदि मैं एक ज्ञात ग्राहक को वापस करने के लिए ग्राहक स्रोत का नकल करता हूं, तो मैं उनमें से किसी का परीक्षण नहीं कर रहा हूं। –

+0

यदि आप शामिल विधि का नकल करते हैं तो आप एक ज्ञात ग्राहक को वापस नहीं कर रहे हैं लेकिन ज्ञात ग्राहकों की एक सूची है ताकि आप यह जांच सकें कि यह कहां है कि यह ग्राहक आईडी के आईडी को पाता है या नहीं। जहां तक ​​शामिल विधि का संबंध है, आप यह भी सत्यापित करते हैं कि आप इसे सही तर्क के साथ कहते हैं: आदेश –

6

हाँ, वहाँ कम से कम एक ऐसी प्रदाता है - SQLite। मैंने इसे थोड़ा सा इस्तेमाल किया है और यह काम करता है। इसके अलावा आप SQL Server Compact आज़मा सकते हैं। यह एक एम्बेडेड डेटाबेस है और इसमें ईएफ प्रदाता भी हैं।
संपादित करें:
SQLite में स्मृति डेटाबेस (link1) के लिए समर्थन हासिल है। आपको बस एक कनेक्शन स्ट्रिंग निर्दिष्ट करना है जैसे: "डेटा स्रोत =: मेमोरी:; संस्करण = 3; नया = सही;"। यदि आपको एक उदाहरण की आवश्यकता है तो आप SharpArchitecture देख सकते हैं।

+0

मैं एक एम्बेडेड (इन-प्रोसेस) डेटाबेस का उपयोग कर सकता हूं, लेकिन मैं पूरी तरह से स्मृति में जाना पसंद करूंगा। मैं अपनी टेबल को परिभाषित करना चाहता हूं और कुछ पंक्तियों को कोड में पूरी तरह से पॉप्युलेट करना चाहता हूं, और कभी भी डिस्क पर कुछ भी लिखना नहीं चाहता हूं। तब मैं यूनिट टेस्ट सत्यापित कर सकता था कि मेरा ग्राहक सेवा क्वेरी सही ढंग से डेटा करता है। –

+0

SQLite इन-मेमोरी डेटाबेस का समर्थन करता है, संपादित उत्तर देखें। – zihotki

+0

मैं स्मृति के भीतर एक वास्तविक डीबी रन पसंद करूंगा क्योंकि परीक्षण करने की सबसे महत्वपूर्ण बात डीबी रिश्ते और बाधाएं हैं और कोड के लिए आपके पास बहुत कम समर्थन है। मुझे परेशान करता है कि यह एप्लिकेशन तर्क है और आपको मॉडल में प्रदर्शित किया जाना चाहिए, न कि डेटाबेस में। – terjetyl

10

एक बेहतर दृष्टिकोण यहाँ एफई कोड संपुटित करने के लिए भंडार पैटर्न का उपयोग करने के लिए हो सकता है। अपनी सेवाओं का परीक्षण करते समय आप मोक्स या नकली का उपयोग कर सकते हैं। अपने भंडारों का परीक्षण करते समय आप वास्तविक डीबी को हिट करना चाहते हैं ताकि आप यह सुनिश्चित कर सकें कि आपको परिणाम मिल रहे हैं।

+0

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

+1

लॉल .. और कैसे LINQ2Entities प्रश्नों को रिपोजिटरी पैटर्न के साथ परीक्षण किया जा सकता है? ऐसा करने का कोई तरीका नहीं है क्योंकि ये प्रश्न SQL क्वेरी उत्पन्न करेंगे और हमें डेटाबेस में भी उनका परीक्षण करने की आवश्यकता है। – zihotki

+1

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

1

आप SQL Server Compact की कोशिश कर सकते हैं लेकिन यह काफी कुछ जंगली सीमाएँ हैं: जब यह इकाई की रूपरेखा

  • एसक्यूएल सर्वर कॉम्पैक्ट के साथ प्रयोग किया जाता है का समर्थन नहीं करता

    • एसक्यूएल सर्वर कॉम्पैक्ट पेजिंग प्रश्नों में छोड़ें भाव का समर्थन नहीं करता सर्वर द्वारा जेनरेट चाबी या मूल्यों के साथ संस्थाओं जब यह इकाई की रूपरेखा
    • कोई बाहरी मिलती है, मुक़ाबला, तैरता पर सापेक्ष साथ प्रयोग किया जाता है, तब समेकित करता है
  • 12

    लेख http://www.codeproject.com/Articles/460175/Two-strategies-for-testing-Entity-Framework-EffortEffort -Entity फ्रेमवर्क प्रदाता है कि स्मृति में चलाता है वर्णन करता है।

    आप अभी भी अपने DbContext या ObjectContext कक्षाएं इकाई परीक्षण के भीतर, एक वास्तविक डेटाबेस के लिए बिना उपयोग कर सकते हैं।

    16

    एक InMemory प्रदाता EF7 (रिलीज) में शामिल है।

    आप या तो NuGet package उपयोग करें, या GitHub पर EF repo (view source) में इसके बारे में पढ़ सकते हैं।

    +4

    हालांकि यह सच है, ईएफ 7 अभी भी बहुत अधिक रिलीज है और माइक्रोसॉफ्ट ने कहा है कि ईएफ 7 बस अगली नहीं है ईएफ 6 से संस्करण; यही कारण है कि उन्होंने इसका नाम बदल दिया है ईएफ कोर 1.0 –

    +0

    हमारी टीम ने जटिल प्रकारों और टीपीटी लागू होने तक ईएफ 7 को छूने का फैसला नहीं किया। ईएफ 7 बहुत कच्चा है। – Shimmy

    0

    EF Core में वहाँ ऐसा करने के लिए दो मुख्य विकल्प हैं:

    1. SQLite in-memory mode आप एक प्रदाता है कि एक संबंधपरक डेटाबेस की तरह बर्ताव के खिलाफ कुशल परीक्षण लिखने के लिए अनुमति देता है।
    2. The InMemory provider एक हल्के प्रदाता न्यूनतम निर्भरता है कि है, लेकिन

    मैं SQLite उपयोग कर रहा हूँ हमेशा एक संबंधपरक डेटाबेस की तरह व्यवहार नहीं कर रहा है और यह है कि मैं Azure एसक्यूएल उत्पादन डेटाबेस के साथ क्या करने की जरूरत सभी प्रश्नों का समर्थन करता है,।

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