У меня есть решение, в котором у меня есть проект данных, содержащий файл EF6 .edmx, созданный из существующей базы данных. Я разделяю сущности на отдельный проект Entities и имею проект Repositories, который ссылается на них обоих.
Я добавил BaseRepository с некоторыми распространенными методами и хочу протестировать его. Вот так выглядит лидер класса...
public class BaseRepository<T> : BaseRepositoryInterface<T> where T : class {
private readonly MyEntities _ctx;
private readonly DbSet<T> _dbSet;
public BaseRepository(MyEntities ctx) {
_ctx = ctx;
_dbSet = _ctx.Set<T>();
}
public IEnumerable<T> GetAll() {
return _dbSet;
}
//...
}
Следуя коду, который я нашел на https://stackoverflow.com/a/21074664/706346, я попробовал следующее. .
[TestMethod]
public void BaseRepository_GetAll() {
IDbSet<Patient> mockDbSet = Substitute.For<IDbSet<Patient>>();
mockDbSet.Provider.Returns(GetPatients().Provider);
mockDbSet.Expression.Returns(GetPatients().Expression);
mockDbSet.ElementType.Returns(GetPatients().ElementType);
mockDbSet.GetEnumerator().Returns(GetPatients().GetEnumerator());
MyEntities mockContext = Substitute.For<MyEntities>();
mockContext.Patients.Returns(mockDbSet);
BaseRepositoryInterface<Patient> patientsRepository
= new BaseRepository<Patient>(mockContext);
List<Patient> patients = patientsRepository.GetAll().ToList();
Assert.AreEqual(GetPatients().Count(), patients.Count);
}
private IQueryable<Patient> GetPatients() {
return new List<Patient> {
new Patient {
ID = 1,
FirstName = "Fred",
Surname = "Ferret"
}
}
.AsQueryable();
}
Обратите внимание, что я изменил файл контекста TT, чтобы использовать IDbSet, как это было предложено Стюартом Клементом в его комментарии от 04 декабря 2015, в 22:41.
Однако, когда я запускаю этот тест, он дает исключение нулевой ссылки, так как строка в конструкторе базового репозитория, которая устанавливает _dbSet
, оставляет его нулевым...
_dbSet = _ctx.Set<T>();
Я предполагаю, что мне нужно добавить еще одну строку, когда я настрою свой фиктивный контекст, но я не уверен, что именно. Я думал, что приведенного выше кода должно быть достаточно для заполнения DbSet.
Кто-нибудь может объяснить, что я пропустил или сделал неправильно?