首页 > 解决方案 > 在接口上模拟扩展方法

问题描述

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

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

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

        return session.Query<TEntity>();
    }

我可以成功地装配 GetCurrentUnitOfWork 方法来返回一个模拟的 ISession,而不是去数据库,而是返回对象列表。

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

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

提前致谢。

标签: c#.netunit-testingnhibernatemocking

解决方案


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


推荐阅读