2013-07-27 6 views
12

से मैं भंडार पैटर्न, बहुत ही सरल और सहज ज्ञान युक्त के कुछ कार्यान्वयन देखा है, stackoverflow में यहाँ लिंक किए गए फ़ॉर्म अन्य उत्तरभंडार पैटर्न और इकाई परीक्षण स्मृति

http://www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C http://www.remondo.net/repository-pattern-example-csharp/

public interface IRepository<T> 
{ 
    void Insert(T entity); 
    void Delete(T entity); 
    IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate); 
    IQueryable<T> GetAll(); 
    T GetById(int id); 
} 

public class Repository<T> : IRepository<T> where T : class, IEntity 
{ 
    protected Table<T> DataTable; 

    public Repository(DataContext dataContext) 
    { 
     DataTable = dataContext.GetTable<T>(); 
    } 
... 

मैं कैसे निर्धारित कर सकते हैं इकाई परीक्षण करते समय स्मृति से काम करने के लिए? क्या स्मृति में किसी भी चीज़ से डेटाकॉन्टेक्स्ट या लिंक टेबल बनाने का कोई तरीका है? मेरा विचार संग्रह (सूची, शब्दकोश ...) बनाना था और यूनिट परीक्षण करते समय इसे दबाएं।

धन्यवाद!

संपादित करें: क्या मैं कुछ इस तरह की जरूरत है:

  • मैं
  • मैं एक वर्ग पुस्तकालय है एक वर्ग बुक है
  • Library निर्माता में, मैं भंडार प्रारंभ:

    var bookRepository = new Repository<Book>(dataContext)

  • और Library तरीकों जब परीक्षण यह

    public Book GetByID(int bookID) 
    { 
        return bookRepository.GetByID(bookID) 
    } 
    

की तरह, भंडार का उपयोग करें, मैं एक स्मृति संदर्भ प्रदान करना चाहते हैं। जब उत्पादन में, मैं एक वास्तविक डेटाबेस संदर्भ प्रदान करेगा।

+0

मैं कुछ नमूना कोड आपके अनुरोध के बाद जोड़ा । –

उत्तर

18

मैं Moq या RhinoMocks जैसी मॉकिंग लाइब्रेरी का उपयोग करने का सुझाव दूंगा। Moq का उपयोग कर एक अच्छा ट्यूटोरियल here पाया जा सकता है।

इससे पहले कि आप तय जो एक आप इस्तेमाल करेंगे, निम्नलिखित मदद कर सकता है:

अतिरिक्त जानकारी: इकाई परीक्षण ढांचे की तुलना here पाया जा सकता है।


अद्यतनओपी के अनुरोध

निम्नलिखित बनाएं स्मृति डेटाबेस में एक

var bookInMemoryDatabase = new List<Book> 
{ 
    new Book() {Id = 1, Name = "Book1"}, 
    new Book() {Id = 2, Name = "Book2"}, 
    new Book() {Id = 3, Name = "Book3"} 
}; 

मॉक अपने भंडार (मैं निम्नलिखित उदाहरण के लिए Moq इस्तेमाल किया)

var repository = new Mock<IRepository<Book>>(); 

अपने भंडार

// When I call GetById method defined in my IRepository contract, the moq will try to find 
// matching element in my memory database and return it. 

repository.Setup(x => x.GetById(It.IsAny<int>())) 
      .Returns((int i) => bookInMemoryDatabase.Single(bo => bo.Id == i)); 

सेट करें

var library = new Library(repository.Object); 

और अंत में कुछ परीक्षण निर्माता पैरामीटर में अपने नकली वस्तु पारित करके एक पुस्तकालय वस्तु बनाएँ:

// First scenario look up for some book that really exists 
var bookThatExists = library.GetByID(3); 
Assert.IsNotNull(bookThatExists); 
Assert.AreEqual(bookThatExists.Id, 3); 
Assert.AreEqual(bookThatExists.Name, "Book3"); 

// Second scenario look for some book that does not exist 
//(I don't have any book in my memory database with Id = 5 

Assert.That(() => library.GetByID(5), 
        Throws.Exception 
         .TypeOf<InvalidOperationException>()); 

// Add more test case depending on your business context 
..... 
+1

ट्यूटोरियल के लिए बहुत धन्यवाद! लेकिन मुझे एक मौजूदा वर्ग का परीक्षण करने की आवश्यकता है जो भंडार का उपयोग कर रहा है। एक 'नकली' भंडार बनाना और इस तरह से परीक्षण करना केवल मुझे यह जांचने के लिए कार्य करता है कि भंडार पैटर्न अच्छी तरह कार्यान्वित किया गया है। मैं इसे – Kaikus

+0

@ काइकस संपादित करके अपने प्रश्न को स्पष्ट करने की कोशिश करूंगा: यदि आप भंडार का उपयोग कर कक्षा के संक्षिप्त कार्यान्वयन को दे सकते हैं तो यह उपयोगी होगा –

+0

तो, यदि मैं सही ढंग से समझता हूं, तो विचार 'संदर्भ' को रोकना नहीं है, लेकिन पूरी तरह से भंडार नकली करने के लिए। फिर जब एक इकाई को तुरंत चालू करें, तो मुझे सभी को अपने स्वयं के भंडार (वास्तविक एक या नकली एक) को इंजेक्टर का उपयोग करके इंजेक्ट करना होगा। धन्यवाद! – Kaikus

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