Unit Testing Entity Framework mit Mock IDbSet
Ich habe noch nie Unit-Tests durchgeführt und bin bei meinem ersten Test gestolpert und gestolpert. Das Problem ist, dass die_repository.Golfers.Count();
zeigt immer an, dass dieDbSet
ist leer.
Mein Test ist einfach, ich versuche nur, einen neuen Golfer hinzuzufügen
[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()
};
}
Ich habe ein Datenmodell mit Entity Framework und Code-First erstellt. Ich habe eine abgeleitete Klasse für IDbSet verspottet, um meinen Kontext zu testen.
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
}
Wenn ich debugge und durch den Code gehe, sehe ich, dass ich das instanziiere_repository
und fülle es mit drei gefälschten Golfspielern, aber wenn ich aus der Zusatzfunktion aussteige, wird die_respoistory.Golfers
ist wieder leer. Wenn ich einen neuen Golfer hinzufüge, den_set.Add(entity)
Läuft und der Golfer kommt hinzu, aber nochmal_respoistory.Golfers
ist leer. Was vermisse ich hier?
Aktualisieren
Es tut mir leid, dass ich ein Idiot bin, aber ich hatte das nicht implementiertset
auf meinemMockGolfEntities
Kontext. Der Grund, warum ich es nicht hatte, war, dass ich es zuvor versucht hatte, aber nicht herausfinden konnte, wie es weiterging und es vergessen hatte. Also, wie stelle ich ein?IDbSet
? Dies ist, was ich versucht habe, aber es gibt mir einen Stapelüberlauffehler. Ich fühle mich wie ein Idiot, aber ich kann nicht herausfinden, wie man die Set-Funktion schreibt.
public class MockGolfEntities : DbContext, IContext
{
public MockGolfEntities() {}
public IDbSet<Golfer> Golfers {
get {
return new InMemoryDbSet<Golfer>();
}
set {
this.Golfers = this.Set<Golfer>();
}
}
}