Модульное тестирование Entity Framework с помощью Mock IDbSet
Я никогда прежде не проводил модульное тестирование, и я споткнулся и споткнулся о моем первом тесте. Проблема в том, что_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()
};
}
Я построил модель данных, используя Entity Framework и Code-First. Я издевался над производным классом для 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
пустой. Что мне здесь не хватает?
Update
Прошу прощения за то, что я идиот, но я не реализовалset
на моемMockGolfEntities
контекст. Причина, по которой я этого не делал, заключается в том, что я пытался раньше, но не мог понять, как, пошел дальше и забыл об этом. Итак, как мне установитьIDbSet
? Это то, что я пробовал, но это дает мне ошибку переполнения стека. Я чувствую себя идиотом, но не могу понять, как написать функцию set.
public class MockGolfEntities : DbContext, IContext
{
public MockGolfEntities() {}
public IDbSet<Golfer> Golfers {
get {
return new InMemoryDbSet<Golfer>();
}
set {
this.Golfers = this.Set<Golfer>();
}
}
}