【发布时间】:2018-03-27 03:21:25
【问题描述】:
我正在努力通过编写一些可以为我创建属性的助手来使 EF 更容易进行单元测试。我有几个支持字段
private Mock<DbSet<Workflow>> mockedWorkFlows;
private Mock<DbSet<WorkflowError>> mockedWorkFlowErrors;
我想要一个通用函数能够使用以下函数返回正确的支持字段
public Mock<DbSet<T>> Mocked<T>(T t) where T : class
{
if ( (object)t is Workflow)
{
return mockedWorkFlows; //cannot Workflow to T
}
}
我希望根据传递的类型返回几个私有支持字段。
但是,即使我添加了Workflow 的类约束,我也会遇到同样的错误。
我也尝试打开t's 类型,但也没有运气。除了对象之外,几个支持字段的类型不共享一个共同的祖先。我正在尝试做的事情可能吗?
【问题讨论】:
-
我看不出这种方法有什么意义。创建一个 mock 需要 1 行代码,如果你想设置 mock,你必须单独设置每个 mock,所以你为什么不为某些类型的 mock 创建一个工厂。
-
从 EF 上下文中模拟 IDbSet
不止一行代码。我有一个流利的接口来分配数据,但是你必须在某个地方公开支持字段,因为当你监视时,这就是实际调用的内容。我只想要一个更小的 API,而不是为上下文的所有 IDbSet 属性使用 WorkflowsMocked、WorkflowErrorsMocked 等。 -
您是否考虑过模拟
SqlConnection,而不是模拟DbSet,例如,使用Effort 框架? github.com/tamasflamich/effort -
@BenCottrell 不,我没有看到 Effort,但就测试而言,没有数据库,无论如何,任何 EF 调用都会被模拟。这个问题实际上与 EF 或 mocking 没有直接关系。我只想让返回类型本质上取决于泛型函数的类型参数。