Grazie, @RonnBlack per la vostra soluzione! Nel mio caso, ho continuato a ottenere questa eccezione perché Session.SessionID era nullo:
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()
Per risolvere questo problema implemento @ codice di RonnBlack questo modo utilizzando il Moq Mock<HttpSessionStateBase>
al posto del suo 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);
}
Per dettagli, vedi http://weblogs.asp.net/gunnarpeipman/using-moq-to-mock-asp-net-mvc-httpcontextbase
Grazie per questo esempio, è stato molto utile. Ho modificato leggermente il tuo MockHttpSession per restituire null piuttosto che generare un'eccezione quando la chiave non esiste nel dizionario per imitare più da vicino l'oggetto HttpSession. Solo un consiglio per altri consumatori. – DavidWhitney
Esattamente quello di cui avevo bisogno. +1 – fre0n
Ho cercato di fare questo w/o attualmente in grado di fare riferimento a un framework di simulazione, e il tuo MockHttpSession è il miglior esempio che ho trovato finora. Ho scoperto che cambiando il getter in quanto tale ottieni {return _sessionStorage.ContainsKey (name)? _sessionStorage [nome]: null; } consentirà il test del codice che viene scritto come - if (sessionProperty ["some key"] == null) {} –