【发布时间】:2019-04-01 14:32:03
【问题描述】:
我正在尝试模拟一些调用扩展方法的代码。这是不是为可测试而编写的遗留代码,但我的任务是尝试为其创建单元测试而不必更改代码,因为时间/政治/等现在允许这样做。
无论如何,我要模拟的代码是在我们的应用程序数据访问框架中。我们使用 NHibernate 的(非常旧的)版本(因此是遗留的)。我们有一个方法使用 nHibernate 返回一个 IQueryable 接口供我们查询。它看起来像这样:
public static IQueryable<TEntity> Linq()
{
ISession session = GetCurrentUnitOfWork();
return session.Query<TEntity>();
}
我可以成功地装配 GetCurrentUnitOfWork 方法来返回一个模拟的 ISession,而不是去数据库,而是返回对象列表。
问题是 ISession 上没有定义 Query 方法。它是 ISession 的扩展方法。由于编译框架代码是为了调用扩展方法 Query(),即使我在模拟的 ISession 上定义了完全相同的方法,扩展方法仍然会被调用。
那么,是否有人对我如何操纵这段代码来调用 Query method() 的模拟版本有任何想法?
提前致谢。
【问题讨论】:
-
@PavelAnikhouski 我看到了这两个。不同之处在于假设扩展方法在我的代码库中。在这种情况下,它不是。扩展方法被编译成第 3 方 dll。所以我不一定要模拟扩展,更像是我必须尝试重定向它。
标签: c# .net unit-testing nhibernate mocking