我已经使用 FakeItEasy 模拟了 MVC 控制器中的会话对象,方法是:
var session = A.Fake<HttpSessionStateBase>();
A.CallTo(() => session["SomeKey"]).Returns("SomeValue");
Controller.ControllerContext = new ControllerContext(mockHttpContext, new RouteData(), Controller);
如果您在控制器操作中访问会话对象,它将返回正确的值:
public ActionResult Index()
{
var value = Session["Key"]; // value = "SomeValue" like it is supposed to
...
}
稍后会在控制器中出现问题,其中会话是通过这样的设置器使用相同的键设置的:
Session["Key"] = "SomeOtherValue";
然后当使用密钥时,它返回错误的值:
var value = Session["Key"]; // value = "Key"
模拟会话不再返回我的模拟值,也不再返回新值,而是返回键(WTF?!)。我究竟做错了什么?当使用 setter 时,模拟对象实际上会发生什么?