Спасибо, @RonnBlack для решения! В моем случае, я продолжал получать это исключение, потому что Session.SessionID был нулевым:
System.NotImplementedException was unhandled by user code
HResult=-2147467263
Message=The method or operation is not implemented.
Source=System.Web
StackTrace:
at System.Web.HttpSessionStateBase.get_SessionID()
Чтобы решить эту проблему, я реализовать @ код RonnBlack в этот путь, используя Moq Mock<HttpSessionStateBase>
вместо его MockHttpSession:
private readonly MyController controller = new MyController();
[TestFixtureSetUp]
public void Init()
{
var session = new Mock<HttpSessionStateBase>();
session.Setup(s => s.SessionID).Returns(Guid.NewGuid().ToString());
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var server = new Mock<HttpServerUtilityBase>();
// Not working - IsAjaxRequest() is static extension method and cannot be mocked
// request.Setup(x => x.IsAjaxRequest()).Returns(true /* or false */);
// use this
request.SetupGet(x => x.Headers).Returns(
new System.Net.WebHeaderCollection
{
{"X-Requested-With", "XMLHttpRequest"}
});
var context = new Mock<HttpContextBase>();
//context
context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session.Object);
context.Setup(ctx => ctx.Server).Returns(server.Object);
context.SetupGet(x => x.Request).Returns(request.Object);
context.SetupGet(p => p.Request.Url).Returns(new Uri("http://www.mytesturl.com"));
var queryString = new NameValueCollection { { "code", "codeValue" } };
context.SetupGet(r => r.Request.QueryString).Returns(queryString);
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
}
Для получения дополнительной информации см. http://weblogs.asp.net/gunnarpeipman/using-moq-to-mock-asp-net-mvc-httpcontextbase
Спасибо за этот образец, это было очень полезно. Я немного изменил ваш MockHttpSession, чтобы возвращать null, а не бросать исключение, когда ключ не существует в словаре, чтобы более точно имитировать объект HttpSession. Просто совет для других потребителей. – DavidWhitney
То, что мне нужно. +1 – fre0n
Я пытался это сделать без возможности ссылки на насмешливую структуру, и ваш MockHttpSession - лучший пример, который я нашел до сих пор. Я обнаружил, что изменение getter как такового получило {return _sessionStorage.ContainsKey (имя)? _sessionStorage [имя]: null; } позволит тестировать код, который записывается как - if (sessionProperty ["some key"] == null) {} – 2012-04-02 18:19:57