在接口上模拟扩展方法

时间:2019-04-01 14:32:03

标签: c# .net unit-testing nhibernate mocking

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

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

    public static IQueryable<TEntity> Linq()
    {
        ISession session = GetCurrentUnitOfWork();

        return session.Query<TEntity>();
    }

我可以成功地装配GetCurrentUnitOfWork方法以返回模拟的ISession,该ISession无需进入数据库,而是返回对象列表。

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

那么,有人对我如何绑定此代码以调用Query method()的模拟版本有任何想法吗?

先谢谢了。

1 个答案:

答案 0 :(得分:1)

我建议使用反射来查看Query <>扩展在ISession对象上调用的方法,然后在ISession上模拟那些方法,并保留Query扩展。