在接口上模拟扩展方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在接口上模拟扩展方法相关的知识,希望对你有一定的参考价值。

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

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

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

        return session.Query<TEntity>();
    }

我可以成功地使用GetCurrentUnitOfWork方法来返回一个模拟的ISession,它不会返回到DB,而是返回对象的列表。

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

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

提前致谢。

答案

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

以上是关于在接口上模拟扩展方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 onSaveInstanceState 在我的片段上保存和恢复接口

Java 8 新特性总结

尝试在空对象引用上调用接口方法“____”[重复]

使用 Moq 模拟扩展方法

是否扩展接口,何时基类已经扩展了相同的接口

模拟对象的方法在接口向下转换后返回null