解释
两个接口的实现适用于UnitOfWork
和Repository<T>
。由于存储库是通用的,我很难在我的Repository
(对于每个实体)中保持UnitOfWork
的多个引用,或 一个通用方法,返回正确的方法(目前就是这种方式)。
问题在于我所说的方法:
// In the controller, this method is called like this
// Student student = unitOfWork.Repository<Student>().GetByID(id);
// UnitOfWork.cs
public IRepository<TEntity> Repository<TEntity>() where TEntity : class {
return new Repository<TEntity>(dbcontext);
}
// MockUnitOfWork.cs
public IRepository<TEntity> Repository<TEntity>() where TEntity : class {
return new MockRepository<TEntity>();
}
问题是MockRepository
,因为它适用于List
。由于我正在返回一个新实例,因此无法跟踪新插入的对象是否在列表中(如果是POST CREATE操作)。
// MockRepository.cs
public IList<TEntity> Entities { get; private set; }
问题
到目前为止,我发现了这个问题的两个可能原因:
我不应该测试创建的实体是否在列表中,因为那是一个模拟。这意味着MockRepository.Add()
会有一个空身。
我应该为UnitOfWork
中的每个存储库保留一个引用,而不是每次都返回一个新实例。这意味着每次我向域模型添加新实体时,我都必须使用新实体的引用和初始化来更新UnitOfWork
代码。
结论
如果问题是第1号,除了断言viewResult.ViewName == "Index"
或类似问题之外,我该如何测试呢?