在接口上模拟扩展方法



我正在尝试模拟一些调用扩展方法的代码。 这是不是为可测试而编写的遗留代码,但我的任务是尝试为它创建单元测试,而无需更改代码,因为时间/政治/等现在允许这样做。

无论如何,我试图模拟的代码在我们的应用程序数据访问框架中。 我们使用(非常古老的)版本的NHibernate(因此是遗留的)。 我们有一个方法,它使用 nHibernate 返回一个 IQueryable 接口供我们查询。 它看起来像这样:

public static IQueryable<TEntity> Linq()
{
ISession session = GetCurrentUnitOfWork();
return session.Query<TEntity>();
}

我可以成功地操纵 GetCurrentUnitOfWork 方法以返回模拟的 ISession,它不是转到数据库,而是返回对象列表。

问题是查询方法未在 ISession 上定义。 这是ISession的扩展方法。 由于框架代码被编译为调用扩展方法 Query(),即使我在模拟的 ISession 上定义了完全相同的方法,扩展方法仍然被调用。

那么,有没有人对我如何操纵这段代码来调用 Query 方法() 的模拟版本有任何想法?

提前谢谢。

我建议使用反射来查看 Query<> 扩展在 ISession对象上调用了哪些方法,然后在 ISession 上模拟这些方法,而不要理会 Query 扩展。

最新更新