2010-05-05 25 views
13

LINQ से SQL DAL के साथ यूनिट परीक्षण लिखने का एक अच्छा तरीका क्या है?डेटा एक्सेस लेयर के साथ यूनिट परीक्षण

वर्तमान में मैं कुछ डेटाबेस परीक्षण कर रहा हूं और डेटाबेस तक पहुंचने वाले सहायक तरीकों को बनाने की आवश्यकता है, लेकिन मैं उन तरीकों को अपने मुख्य रेपो में नहीं चाहता हूं।

तो मेरे पास डीएएल की दो प्रतियां हैं, मेरी मुख्य परियोजना में से एक और टेस्ट प्रोजेक्ट में से एक है। यदि मैं डेटा परत के लिए एक अलग प्रोजेक्ट बनाता हूं तो इन चीजों को प्रबंधित करना आसान है? मुझे यकीन नहीं है कि इस तरह से संपर्क करने का एक बेहतर तरीका कौन सा तरीका है।

यदि मैं डेटा लेयर प्रोजेक्ट बनाता हूं तो क्या मैं अपने सभी रिपो को उस प्रोजेक्ट में भी ले जाऊंगा? मुझे यकीन नहीं है कि परतों को व्यवस्थित तरीके से कैसे सेट करें।

धन्यवाद

+0

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

उत्तर

5

मैं अपने DAL परत के लिए Linq2Sql उपयोग कर रहा हूँ और मैं एक अलग परियोजना के रूप में यह है। मेरे डोमेन प्रोजेक्ट में मेरे पास एक रिपोजिटरी इंटरफ़ेस है जिसे मैं अपने डीएएल प्रोजेक्ट में एक कस्टम लिंक 2 स्क्लकर कैरपोजिटरी का उपयोग करके कार्यान्वित करता हूं, यह कक्षा जेनरेट लिंकक 2 एसक्यूएल कक्षाओं को लपेटती है।

उदाहरण के लिए। Car.Core परियोजना

public interface ICarRepository 
{ 
    IQueryable<Car> GetAllCars(); 
    void Add(Car); 
} 

में मैं तो इंटरफ़ेस जो उत्पन्न Linq2Sql वर्ग की पहुंच ऊपर लपेटता के एक कार्यान्वयन है।

Car.Data परियोजना

public class SqlCarRepository : ICarRepository 
{ 
    private CarDataContext _context; 

    public SqlCarRepository() 
    { 
     _context = new CarDataContext(); 
    } 

    #region ICarRepository Members 

    public IQueryable<Car> GetAllCars() 
    { 
     return _context.Cars; 
    } 

मैं तो एक परीक्षण परियोजना Car.Data.Test जो तब mocks का उपयोग करता है दूर ICarRepository और परीक्षण उपहास करने के लिए किया है। मुझे लगता है कि आप जो वर्णन कर रहे हैं उससे थोड़ा अलग है। लेकिन मुझे लगता है कि आप कोशिश करना चाहते हैं और अलग करना चाहते हैं कि आप अपने आवेदन से डीएएल हैं, इसलिए यह एक परिधीय है जिसे आप चाहते थे तो बाहर कर दिया जा सकता है।

मैं नहीं मिला है सब पूरी तरह से हल कर, लेकिन मैं वर्तमान में इन परियोजनाओं है:

Car.Core   --- All the interfaces and domain objects, DTO's etc 
Car.Core.Tests --- The tests of the core business logic. 
Car.Web   --- Asp.net MVC frontend 
Car.Web.Tests --- Tests for the website 
Car.Data   --- The Linq2Sql stuff lives in here 
Car.Data.Tests --- The tests for the DAL layer 

है यही कारण है कि हालांकि यह अब काम करने के लिए सबसे अच्छा तरीका नहीं हो सकता है क्या मैं इस समय मिल गया है।

मैं The Onion Architecture के माध्यम से पढ़ने की सिफारिश करता हूं और प्रेरणा के लिए MVC StoreFront वीडियो देख रहा हूं; सौभाग्य।

6

मैं सितंबर 200 9 के लेख में सितंबर 200 9 के लेख में "स्टूडियो संचालित विकास में डाटाबेस निर्भरता को समाप्त करने" शीर्षक स्टूडियो पत्रिका में उल्लिखित रिपोजिटरी पैटर्न का उपयोग करूंगा। मैं इस पैटर्न का उपयोग कर रहा हूं क्योंकि मैंने बड़ी सफलता के साथ लेख पढ़ा है। यह पैटर्न आपकी डेटा परत को कम करने और अच्छे यूनिट परीक्षण लिखने में मदद करेगा।

इसके लिए आपको एक एन-स्तरीय आर्किटेक्चर अपनाने और एक अलग डेटा परत बनाने की आवश्यकता होगी, लेकिन लंबे समय तक यह इसके लायक है।

यहां ऑनलाइन लेख का एक लिंक है। Repository Pattern

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