2012-08-03 15 views
10

के साथ यूनिट परीक्षण इकाई फ्रेमवर्क मैंने पहले कभी यूनिट परीक्षण नहीं किया है, और मैंने अपने पहले टेस्ट पर ठोकर खाई है। समस्या यह है कि _repository.Golfers.Count(); हमेशा इंगित करता है कि DbSet खाली है।मॉक आईडीबीसेट

मेरे परीक्षण, सरल है मैं सिर्फ एक नया गोल्फ खिलाड़ी

[TestClass] 
public class GolferUnitTest //: GolferTestBase 
{ 
    public MockGolfEntities _repository; 

    [TestMethod] 
    public void ShouldAddNewGolferToRepository() 
    { 
     _repository = new MockGolfEntities(); 

     _repository.Golfers = new InMemoryDbSet<Golfer>(CreateFakeGolfers()); 

     int count = _repository.Golfers.Count(); 
     _repository.Golfers.Add(_newGolfer); 

     Assert.IsTrue(_repository.Golfers.Count() == count + 1); 
    } 

    private Golfer _newGolfer = new Golfer() 
    { 
     Index = 8, 
     Guid = System.Guid.NewGuid(), 
     FirstName = "Jonas", 
     LastName = "Persson" 
    }; 
    public static IEnumerable<Golfer> CreateFakeGolfers() 
    { 
     yield return new Golfer() 
     { 
      Index = 1, 
      FirstName = "Bill", 
      LastName = "Clinton", 
      Guid = System.Guid.NewGuid() 
     }; 
     yield return new Golfer() 
     { 
      Index = 2, 
      FirstName = "Lee", 
      LastName = "Westwood", 
      Guid = System.Guid.NewGuid() 
     }; 
     yield return new Golfer() 
     { 
      Index = 3, 
      FirstName = "Justin", 
      LastName = "Rose", 
      Guid = System.Guid.NewGuid() 
     }; 
    } 

मैं इकाई की रूपरेखा और कोड पहले का उपयोग कर एक डाटा मॉडल का निर्माण किया है जोड़ने की कोशिश कर रहा हूँ। मैं (ऑनलाइन लोगों को curtsy है कि मैं वास्तव में याद नहीं कर सकते) आदेश मेरी संदर्भ का परीक्षण करने में IDbSet के लिए एक व्युत्पन्न वर्ग मज़ाक उड़ाया गया है

public class InMemoryDbSet<T> : IDbSet<T> where T : class 
{ 
    readonly HashSet<T> _set; 
    readonly IQueryable<T> _queryableSet; 

    public InMemoryDbSet() : this(Enumerable.Empty<T>()) { } 

    public InMemoryDbSet(IEnumerable<T> entities) 
    { 
     _set = new HashSet<T>(); 

     foreach (var entity in entities) 
     { 
      _set.Add(entity); 
     } 

     _queryableSet = _set.AsQueryable(); 
    } 

    public T Add(T entity) 
    { 
     _set.Add(entity); 
     return entity; 

    } 

    public int Count(T entity) 
    { 
     return _set.Count(); 
    } 

    // bunch of other methods that I don't want to burden you with 
} 

जब मैं डिबग और कोड के माध्यम से कदम मैं देख सकता हूँ कि मैं का दृष्टांत _repository और इसे तीन फीके गोल्फर्स से भरें, लेकिन जब मैं ऐड फ़ंक्शन से बाहर निकलता हूं, तो _respoistory.Golfers फिर खाली होता है। जब मैं एक नया गोल्फर जोड़ता हूं, _set.Add(entity) रन और गोल्फर जोड़ा जाता है, लेकिन फिर _respoistory.Golfers खाली है। मुझे यहां क्या समझ नहीं आ रहा है?

अद्यतन

मैं एक बेवकूफ होने के लिए माफी चाहता हूँ, लेकिन मैं अपने MockGolfEntities संदर्भ पर set लागू नहीं किया था। कारण यह नहीं था कि मैंने पहले कोशिश की लेकिन यह पता नहीं लगा कि कैसे, आगे बढ़कर, और इसके बारे में भूल गए। तो, मैं IDbSet कैसे सेट करूं? मैंने यही कोशिश की है, लेकिन यह मुझे एक स्टैक ओवरफ़्लो त्रुटि देता है। मैं बेवकूफ की तरह महसूस करता हूं, लेकिन मैं यह नहीं समझ सकता कि सेट फ़ंक्शन कैसे लिखना है।

public class MockGolfEntities : DbContext, IContext 
{ 
    public MockGolfEntities() {} 

    public IDbSet<Golfer> Golfers { 
     get { 
      return new InMemoryDbSet<Golfer>(); 
     } 
     set { 
      this.Golfers = this.Set<Golfer>(); 
     } 
    } 
} 
+0

'सेट' विधि 'this.Golfers' को असाइन करके स्वयं को कॉल कर रही है। आपको कहीं भी मूल्य स्टोर करना चाहिए। उदाहरण के लिए: 'this.golfers = value;' जहां 'गोल्फर्स' एक निजी क्षेत्र है ('निजी आईडीबीसेट गोल्फर्स; ')। – Sam

उत्तर

5

आपको प्राप्त/सेट को लागू करने की आवश्यकता नहीं है, तो निम्नलिखित कोड आपके लिए संदर्भ उत्पन्न करने के लिए पर्याप्त होना चाहिए।

public class MockGolfEntities : DbContext, IContext 
{ 
    public MockGolfEntities() {} 

    public IDbSet<Golfer> Golfers { get; set;} 

} 

मैं कोड आप अपने मूल पोस्ट में था implemeted है और सब कुछ मेरे लिए अच्छी तरह से काम करने के लिए लग रहा था - जहां InMemoryDbSet के लिए स्रोत से मिली? मैं NuGet package 1.3 का उपयोग कर रहा हूं, शायद आपको उस संस्करण को आजमाएं?

+0

धन्यवाद- मैं अभी भी परेशान हूं कि सेट को कैसे कार्यान्वित करना है, लेकिन मैं जादू को आईडीबीसेट पर छोड़कर खुश हूं। मुझे एहसास है कि मेरा सेट पागल था, क्योंकि मैं संपत्ति को अनंत लूप में सेट करने की कोशिश कर रहा हूं, लेकिन मैं बेहोश था और कुछ कोड पोस्ट करना चाहता था ताकि यह दिखाया जा सके कि मैंने इसे कम से कम शॉट दिया है :-)। मैंने NuGet का उपयोग नहीं किया, लेकिन मैं इसका उपयोग करने की कोशिश कर रहा हूं। लिंक के लिए धन्यवाद। –

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