【发布时间】:2016-07-12 15:54:59
【问题描述】:
我有一个解决方案,其中我有一个包含 EF6 .edmx 文件的数据项目,该文件是从现有数据库生成的。我将实体拆分为一个单独的实体项目,并有一个引用它们的存储库项目。
我添加了一个带有一些常用方法的 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();
}
请注意,正如 Stuart Clement 在 2015 年 12 月 4 日 22:41 的评论中所建议的那样,我将上下文 TT 文件更改为使用 IDbSet
但是,当我运行这个测试时,它给出了一个空引用异常,因为在基本存储库构造函数中设置_dbSet 的行让它为空...
_dbSet = _ctx.Set<T>();
我猜我在设置模拟上下文时需要添加另一行,但我不确定是什么。我认为上面的代码应该足以填充 DbSet。
谁能解释我错过了什么或做错了什么?
【问题讨论】:
标签: c# entity-framework unit-testing dbcontext nsubstitute