【问题标题】:Mocking an Extension method on an interface在接口上模拟扩展方法
【发布时间】: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() 的模拟版本有任何想法?

提前致谢。

【问题讨论】:

  • 有几个线程,如何模拟静态方法,看看thisthis
  • @PavelAnikhouski 我看到了这两个。不同之处在于假设扩展方法在我的代码库中。在这种情况下,它不是。扩展方法被编译成第 3 方 dll。所以我不一定要模拟扩展,更像是我必须尝试重定向它。

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


【解决方案1】:

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

【讨论】:

  • 我考虑过这一点,作为最后的手段,我会这样做。不过,这似乎是一个巨大的巨大兔子洞等着我迷路:)
猜你喜欢
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2013-12-07
相关资源
最近更新 更多