我正在使用ASP.NET MVC 4和Entity Framework 5.我有模型类和实体映射来将现有表映射到那些模型类.这一切都很好,工作得很好.
现在我想嘲笑这个.我创建了Unit Of Work,它接受DataContext并使用Generic Repository.在那之后,我构建了服务,以便能够立即从许多存储库获取数据,并且只需要有一个DataContext实例.这也很有效.
现在问题:我想用模拟数据测试服务.当我创建Unit Of Work实例时,我希望能够插入一个被模拟的DataContext而不是真正的DataContext.
我试图创建一个IContext接口,让真实的和模拟的DataContext实现,但遇到了DbSet的问题.我试图使用IDbSet并创建一个FakeDbSet但没有成功.我还在互联网上读到用IDbSet模拟上下文并使用FakeDbSet是一种糟糕的方法.
你知道最好的方法是什么?我现在拥有的是我想保留的行为,但是我真的希望能够在DataContext中模拟Model类中的数据.
我知道实体框架已经附带了工作单元行为,并且您不需要在其上添加额外的行为.但是我想把它包装在另一个跟踪所有存储库的类中(称为UnitOfWork类).
编辑:我写了两篇文章,用LINQ和Entity Framework解释我的解决方案.
http://gaui.is/how-to-mock-the-datacontext-linq/
http://gaui.is/how-to-mock-the-datacontext-entity-framework/
这是我的代码:
IRepository.cs
public interface IRepository<T> where T : class
{
void Add(T entity);
void Delete(T entity);
void Update(T entity);
T GetById(long Id);
IEnumerable<T> All();
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
}
Run Code Online (Sandbox Code Playgroud)
IUnitOfWork.cs
public interface IUnitOfWork : IDisposable
{
IRepository<TEntity> GetRepository<TEntity>() where TEntity : class;
void Save();
}
Run Code Online (Sandbox Code Playgroud)
Repository.cs
public class Repository<T> : IRepository<T> where T : class
{
private readonly IDbContext …Run Code Online (Sandbox Code Playgroud)