【发布时间】: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