c# - 在接口上模拟扩展方法
问题描述
我正在尝试模拟一些调用扩展方法的代码。这是不是为了可测试而编写的遗留代码,但我的任务是尝试为它创建单元测试而不必更改代码,因为时间/政治/等现在将允许这样做。
无论如何,我试图模拟的代码在我们的应用程序数据访问框架中。我们使用 NHibernate 的(非常旧的)版本(因此是遗留的)。我们有一个方法使用 nHibernate 返回一个 IQueryable 接口供我们查询。它看起来像这样:
public static IQueryable<TEntity> Linq()
{
ISession session = GetCurrentUnitOfWork();
return session.Query<TEntity>();
}
我可以成功地装配 GetCurrentUnitOfWork 方法来返回一个模拟的 ISession,而不是去数据库,而是返回对象列表。
问题是 ISession 上没有定义 Query 方法。它是 ISession 的扩展方法。由于编译框架代码是为了调用扩展方法 Query(),即使我在模拟的 ISession 上定义了完全相同的方法,扩展方法仍然会被调用。
那么,有人对我如何操纵这段代码来调用 Query 方法()的模拟版本有任何想法吗?
提前致谢。
解决方案
我建议使用反射来查看 Query<> 扩展在 ISession 对象上调用了哪些方法,然后在 ISession 上模拟这些方法并单独保留 Query 扩展。
推荐阅读
- javascript - 使用 javascript 设置 PHP 表单数组变量
- python - Python for loop variable(K) in range(1,11) 如何在 HHkC 之类的词中使用并显示 HH1C、HH2C......HH10C?
- postgresql - 在 Postgres 中插入多个表时是否保留顺序
- multi-tenant - 将项目级用户分配给多个租户
- spring - 如何使用集群中的所有 pod 订阅亚马逊 SNS 主题?
- c# - 如何在托管的 MVC 应用程序中获取 Azure AD 对象 ID?
- java - 缓冲区链接和装饰原理 Java I/O
- svg - Labeled Google Corechart 传说中的问题
- java - Appium 在错误的目录中寻找 java
- docker - Filebeat 无法作为 docker 容器启动