【发布时间】:2015-06-25 14:59:45
【问题描述】:
我有一个正在单元测试的 Web API 2.0 项目。我的控制器有一个工作单元。工作单元包含用于各种 DbSet 的大量存储库。我在 Web API 中有一个 Unity 容器,我在测试项目中使用 Moq。在各种存储库中,我使用实体框架的Find 方法根据其键定位实体。此外,我使用的是 Entity Framework 6.0。
这是一个非常普遍的工作单元示例:
public class UnitOfWork
{
private IUnityContainer _container;
public IUnityContainer Container
{
get
{
return _container ?? UnityConfig.GetConfiguredContainer();
}
}
private ApplicationDbContext _context;
public ApplicationDbContext Context
{
get { _context ?? Container.Resolve<ApplicationDbContext>(); }
}
private GenericRepository<ExampleModel> _exampleModelRepository;
public GenericRepository<ExampleModel> ExampleModelRepository
{
get { _exampleModelRepository ??
Container.Resolve<GenericRepository<ExampleModel>>(); }
}
//Numerous other repositories and some additional methods for saving
}
我遇到的问题是我对存储库中的一些 LINQ 查询使用了Find 方法。基于本文MSDN: Testing with your own test doubles (EF6 onwards),我必须创建一个TestDbSet<ExampleModel> 来测试Find 方法。我正在考虑将代码自定义为以下内容:
namespace TestingDemo
{
class TestDbSet : TestDbSet<TEntity>
{
public override TEntity Find(params object[] keyValues)
{
var id = (string)keyValues.Single();
return this.SingleOrDefault(b => b.Id == id);
}
}
}
我想我必须自定义我的代码,以便TEntity 是某种具有 Id 属性的基类的类型。这是我的理论,但我不确定这是处理这个问题的最佳方法。
所以我有两个问题。上面列出的方法是否有效?如果没有,用SingleOrDefault 方法覆盖DbSet 中的Find 方法会更好吗?此外,这种方法只有在它们只有一个主键时才真正有效。如果我的模型有不同类型的复合键怎么办?我想我必须单独处理这些。好的,这是三个问题?
【问题讨论】:
标签: c# linq entity-framework unit-testing