模拟IUnitOfWork和IRepository <t>进行单元测试</t>

时间:2015-02-07 18:43:16

标签: c# asp.net entity-framework unit-testing

解释

两个接口的实现适用于UnitOfWorkRepository<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; }

问题

到目前为止,我发现了这个问题的两个可能原因:

  1. 我不应该测试创建的实体是否在列表中,因为那是一个模拟。这意味着MockRepository.Add()会有一个空身。

  2. 我应该为UnitOfWork中的每个存储库保留一个引用,而不是每次都返回一个新实例。这意味着每次我向域模型添加新实体时,我都必须使用新实体的引用和初始化来更新UnitOfWork代码。

  3. 结论

    如果问题是第1号,除了断言viewResult.ViewName == "Index"或类似问题之外,我该如何测试呢?

0 个答案:

没有答案