如何模拟 System.Data.Linq.Table
我的一个基本存储库类包含一种方法:
public abstract class RepositoryBase<T, TDb> : IRepository<T>
where T : IEntity
where TDb : class, IDbEntity, new()
{
protected internal abstract Table<TDb> GetTable();
...
}
我正在为派生存储库类编写单元测试,其中包含上述方法的实现:
public class CmOptionRepository :
RepositoryBase<ICmOption, CMCoreDAL.DbData.CMOption>, ICmOptionRepository
{
protected internal override System.Data.Linq.Table<CMCoreDAL.DbData.CMOption>
GetTable()
{
return Context.CMOptions;
}
....
}
此处:上下文 - 是 DB 的 Linq 模型,CMOptions - 数据库表之一。
我希望我的“GetTable()”方法返回一组特殊的数据。
我要模拟该方法:
System.Data.Linq.Table<CMCoreDAL.DbData.CMOption> table = ...;
Mock<CmOptionRepository> mockRepository =
new Mock<CmOptionRepository>(MockBehavior.Strict);
mockRepository.Setup(mock => mock.GetTable()).Returns(table);
但不知道如何创建 System.Data.Linq.Table
问题:如何模拟 System.Data.Linq.Table
?或者我可能需要更改方法签名以避免使用 System.Data.Linq.Table
类?
请指教。欢迎任何想法。
PS 我正在使用起订量。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果您使用的是 .NET 4.0,
Table
会实现ITable
,因此您应该在以下位置使用接口ITable
:GetTable
的返回类型而不是具体类型。然后你就可以嘲笑了。在 .NET 3.5 中,这有点困难,因为
Table
仅实现ITable
(不是通用的)。If you are using .NET 4.0,
Table<T>
implementsITable<T>
so that you should use the interfaceITable<TDb>
in the return type ofGetTable
instead of the concrete type. Then you can mock away.In .NET 3.5 it is a little more difficult because
Table<T>
only implementsITable
(not generic).您不应该真正在存储库外部公开
Table
,除非明确需要在Table
实例上执行操作。相反,在存储库中返回IQueryable
,这样更容易模拟。如果您需要执行更新,则可以返回ITable
。You shouldn't really expose
Table<T>
outside of your repository unless there is an explicit need to perform operations on theTable<T>
instance. Instead, returnIQueryable<T>
in your repository, which is easier to mock. If you need to perform updates then you can returnITable<T>
.我想,这是一个解决方案:
模拟数据上下文:
模拟返回表:
模拟“表”对象功能:
说实话,我不确定它是否有效,明天会检查,但现在至少已经编译好了。
I guess, here is a solution:
Mock data context:
Mock returning table:
Mock 'table' object functionality:
To be honest, I not sure if it will works, will check tomorrow, but now it is at least been compiled.
抽象出您的数据访问代码并使用存储库模式。
Abstract away your data access code and use the repository pattern.