【问题标题】:Mock deep level methods [duplicate]模拟深层方法[重复]
【发布时间】:2017-03-31 17:41:08
【问题描述】:

我正在使用 Moq 来模拟我的应用程序的一些对象,现在,我需要模拟这个调用:

accessor.HttpContext.Session.GetInt32("offset");

我尝试过这样做,但不起作用:

var mock = new Mock<HttpContextAccessor>();
        mock.Setup(x => x.HttpContext.Session.GetInt32("offset"))
            .Returns(0);

它会触发此错误:

System.NotSupportedException : 表达式引用了不属于模拟对象的方法:x => x.HttpContext.Session.GetInt32("offset")

【问题讨论】:

  • 起订量不适用于扩展方法。其中,根据错误信息,可以推断GetInt32 是一个扩展方法。尽量避免模拟你无法控制的类型。建议:将您尝试访问的内容包装在您控制的抽象后面,以便在需要时对其进行模拟。
  • @Nkosi - 有点不同。可以模拟扩展方法正在使用的类型。 (您仍然可以直接执行此操作,但您需要设置模拟层次结构)
  • @Pawel 是正确的,并且可以在这种情况下工作,因为所讨论的扩展方法的源代码是开源的,因此我们能够确定需要模拟什么才能使扩展方法工作。请注意,对于封闭源代码扩展,情况并非如此。
  • @Nkosi - 通常你不能模拟静态方法和扩展方法就是这样。关键是能够模拟扩展/静态方法工作的依赖项——无论项目是否开源。如果可以模拟依赖项,那么一切都应该没问题。我同意,如果项目不是开源的,那么弄清楚需要模拟什么以及是否可以模拟它可能会很有挑战性。
  • @Pawel 我同意你的看法。这就是我要指出的。

标签: c# asp.net-core moq


【解决方案1】:

GetInt32 是在ISession 接口上操作的扩展方法。您需要模拟ISession 接口,以便TryGetValue 方法返回预期值(GetInt32 调用GetISession 接口上调用TryGetValue),然后从HttpContext.Session 返回模拟

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2021-09-22
    • 2012-11-28
    相关资源
    最近更新 更多