2017-03-31 72 views
0

I'm使用起订量嘲笑我的应用程序的一些对象,而现在,我需要模拟这一呼吁:模拟深层次的方法

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

我试图做到这一点的方式,但没有作品:

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

它触发此错误:

System.NotSupportedException : Expression references a method that does not belong to the mocked object: x => x.HttpContext.Session.GetInt32("offset")

+0

起订量返回模拟不带扩展方法的工作。根据错误信息,可以推断'GetInt32'是一种扩展方法。尽量避免嘲笑你不能控制的类型。建议:将您试图访问的内容封装在您控制的抽象背后,以便在需要时进行模拟。 – Nkosi

+0

@Nkosi - 它有点不同。扩展方法正在使用的类型可能会被模拟。 (仍然可以直接执行此操作,但需要设置模拟层次结构) – Pawel

+0

@Pawel是正确的,并且可以在这种情况下工作,因为所讨论的扩展方法的源代码是开源的,所以我们能够确定需要什么嘲笑扩展方法的工作。请注意,对于封闭源代码扩展,同样不适用。 – Nkosi

回答

2

GetInt32是在操作的扩展方法接口。您需要模拟ISession接口,这样TryGetValue方法返回的预期值(GetInt32呼叫Get其中ISession接口调用TryGetValue),然后从HttpContext.Session