Piszę test jednostkowy dla aplikacji internetowej MVC 5. Kpiłam z testu HttpContext.Current
. Kiedy uruchomić następujące postaci kodu testy httpSessionStateAfter
rzutHttpContext.Current ma wartość zero po oczekiwaniu (tylko w testach jednostkowych)
System.AggregateException: Wystąpił jeden lub więcej błędów.
----> System.NullReferenceException: Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu.
Dzieje się tak tylko po przeprowadzeniu testów jednostkowych. Po uruchomieniu aplikacji to działa dobrze. Używam Nunit 2.6.3 z rehaper test runner.
var httpSessionStateBefour = System.Web.HttpContext.Current.Session;
var Person= await Db.Persons.FirstOrDefaultAsync();
var httpSessionStateAfter = System.Web.HttpContext.Current.Session;
Jak rozwiązać ten problem?
To jak ja mock HttpContext
HttpContext.Current = Fakes.FakeHttpContext();
HttpContext.Current.Session.Add("IsUserSiteAdmin", true);
HttpContext.Current.Session.Add("CurrentSite", null);
public static class Fakes
{
public static HttpContext FakeHttpContext()
{
var httpRequest = new HttpRequest("", "http://stackoverflow/", "");
var stringWriter = new StringWriter();
var httpResponce = new HttpResponse(stringWriter);
var httpContext = new HttpContext(httpRequest, httpResponce);
var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
new HttpStaticObjectsCollection(), 10, true,
HttpCookieMode.AutoDetect,
SessionStateMode.InProc, false);
httpContext.Items["AspSession"] = typeof (HttpSessionState).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null, CallingConventions.Standard,
new[] {typeof (HttpSessionStateContainer)},
null)
.Invoke(new object[] {sessionContainer});
return httpContext;
}
}
Jakie jest dokładnie twoje pytanie? –
@Tragedian Zgaduję, "dlaczego jest' httpSessionStateAfter' null, ale 'httpSessionStateBefour' nie jest?" – DavidG
Które ramy testowania jednostkowego używasz? Czy na pewno obsługuje konteksty wykonania? Starsze wersje NUnit na przykład nic nie wiedzą o 'Czekaj', więc nie mogą skonfigurować kontynuacji. W aplikacjach ASP.NET kontynuacje są wykonywane na * innym * wątku wątku, który zostanie skonfigurowany z kontekstem wykonania oryginalnego. –