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