Unidad de prueba Entity Framework con Mock IDbSet
Nunca antes había hecho pruebas de unidad, y tropecé y tropecé en mi primera prueba. El problema es que la_repository.Golfers.Count();
siempre indica que elDbSet
esta vacio.
Mi prueba es simple, solo intento agregar un nuevo golfista
[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()
};
}
He construido un modelo de datos utilizando Entity Framework y el código primero. Me burlé de una clase derivada de IDbSet para probar mi contexto (una reverencia para las personas en línea que no puedo recordar exactamente)
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
}
Cuando depuro y paso a través del código puedo ver que hago una instancia de_repository
y llénelo con tres jugadores de golf falsos, pero cuando salgo de la función de agregar, el_respoistory.Golfers
está vacío de nuevo. cuando agrego un nuevo golfista, el_set.Add(entity)
corre y se agrega el golfista, pero de nuevo_respoistory.Golfers
esta vacio. ¿Que me estoy perdiendo aqui?
Actualizar
Lo siento por ser un idiota, pero no había implementado elset
en miMockGolfEntities
contexto. La razón por la que no lo hice es que lo intenté antes, pero no pude averiguar cómo, me moví y me olvidé de ello. Entonces, ¿cómo puedo configurar unIDbSet
? Esto es lo que he intentado, pero me da un error de desbordamiento de pila. Me siento como un idiota, pero no sé cómo escribir la función de configuración.
public class MockGolfEntities : DbContext, IContext
{
public MockGolfEntities() {}
public IDbSet<Golfer> Golfers {
get {
return new InMemoryDbSet<Golfer>();
}
set {
this.Golfers = this.Set<Golfer>();
}
}
}