2012-08-03 7 views
10

Daha önce hiç bir birim testi yapmamıştım ve ilk testimde tökezledim ve tetikledim. Sorun, _repository.Golfers.Count(); her zaman DbSet boş olduğunu gösterir.Birim sınama öğesi ile kimlik Framework

Testim Sadece yeni bir golfçüye ben kod ilk Varlık Framework ve kullanan bir veri modelini inşa ettik

[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() 
     }; 
    } 

eklemeye çalışıyorum basittir. Ben hata ayıklama ve kod üzerinden adım Ben örneğini görebiliriz zaman

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 
} 

(Tam olarak hatırlamıyorum ki çevrimiçi insanlara reverans) benim bağlamı sınamak için IDbSet için türetilmiş bir sınıf alay ettik _repository ve üç sahte golfçülerle doldurun, ancak ekleme işlevinden çıkınca _respoistory.Golfers tekrar boş demektir. Yeni bir golfçü eklediğimde, _set.Add(entity) çalışır ve golfçü eklenir, ancak yine _respoistory.Golfers boştur. Burada neyi özlüyorum?

Güncelleme

ben aptal olduğum için üzgünüm ama benim MockGolfEntities bağlama set uygulanmadı almıştı. Yapmamamın sebebi daha önce denedim ama nasıl olduğunu anlayamadım, taşındı ve unuttu. Peki, bir IDbSet nasıl ayarlayabilirim? Denediğim şey bu, ama bana bir yığın taşması hatası veriyor. Kendimi aptal gibi hissediyorum ama set fonksiyonunu nasıl yazacağımı anlayamıyorum.

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

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

'set' yöntemi 'this.Golfers' öğesine atayarak kendini çağırıyor. Değeri bir yerlerde saklamanız gerekir. Örneğin: 'this.golfers = value;' golfçüler 'özel bir alan' '(özel IDbSet golfçüler; '). – Sam

cevap

5

Sen get/set uygulamak gerekmez, aşağıdaki kodu sizin için bağlam oluşturmak için yeterli olmalıdır.

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

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

} 

Ben orijinal yazı vardı kodunu implemeted ettik ve her şey benim için iyi iş gibi görünüyordu - nereye InMemoryDbSet için kaynak elde ettiniz? NuGet package 1.3 kullanıyorum, belki bu sürümü denemelisiniz?

+0

Teşekkürler-ben istedim eğer seti uygulamak için hala şaşırıyorum, ama ben IDbSet kadar büyüyü bırakmak için mutluyum. Setimin çıldırmış olduğunu anladım, çünkü mülkiyeti sonsuz bir döngüde kurmaya çalışıyorum, ama çaresizdim ve en azından bir şut attığımı göstermek için bir kod göndermek istedim :-). NuGet'i kullanmadım ama kullanmaya başladım. Bağlantı için teşekkürler. –