Gracias, @RonnBlack para su solución! En mi caso, seguí recibiendo esta excepción porque Session.SessionID era nulo:
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()
Para resolver este problema implemento @ código de RonnBlack esta manera el uso de la Moq Mock<HttpSessionStateBase>
en lugar de su 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);
}
Para obtener más información, consulte http://weblogs.asp.net/gunnarpeipman/using-moq-to-mock-asp-net-mvc-httpcontextbase
Gracias por esta muestra, ha sido muy útil. He modificado ligeramente su MockHttpSession para devolver nulo en lugar de arrojar una excepción cuando la clave no existe en el diccionario para imitar más de cerca el objeto HttpSession. Solo un consejo para otros consumidores. – DavidWhitney
Exactamente lo que necesitaba. +1 – fre0n
He intentado hacer esto sin poder actualmente hacer referencia a un marco de burla, y su MockHttpSession es el mejor ejemplo que he encontrado hasta ahora. Descubrí que cambiando el getter como tal obtengo {return _sessionStorage.ContainsKey (name)? _sessionStorage [nombre]: null; } permitirá la prueba de código que se escribe como - if (propiedad de sesión ["alguna clave"] == nulo) {} –