2010-10-04 4 views
3

Je travaille avec un HttpContext falsifié (code fourni à la fin) et il me manque probablement quelque chose parce que je ne peux pas accéder à la collection TempData (quatrième ligne de la méthode SetFakeControllerContext). Chaque fois que je je reçois ce message d'erreur:Problème avec TempData et HttpContext Faked utilisant ASP.NET MVC

'controller.TempData' a lancé une exception de type 'System.AccessViolationException'

Le code qui appelle FakeHttpContext est:

public static void SetFakeControllerContext(this Controller controller) 
    { 
     HttpContextBase httpContext = FakeHttpContext(string.Empty); 
     var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller); 
     controller.ControllerContext = context; 
     controller.TempData = new TempDataDictionary(); //This is not necessary! It was just a test!!!! 
    } 

Quelqu'un sait-il Qu'est ce que je fais mal?

public static HttpContextBase FakeHttpContext(string username){ 

var context = new Mock<HttpContextBase>(); 
var request = new Mock<HttpRequestBase>(); 
var response = new Mock<HttpResponseBase>(); 
var session = new Mock<HttpSessionStateBase>(); 
var server = new Mock<HttpServerUtilityBase>(); 
var user = new Mock<IPrincipal>(); 
var identity = new Mock<IIdentity>(); 

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.Setup(ctx => ctx.User).Returns(user.Object); 

user.Setup(ctx => ctx.Identity).Returns(identity.Object); 

if (!string.IsNullOrEmpty(username)) 
{ 
    identity.Setup(id => id.IsAuthenticated).Returns(true); 
    identity.Setup(id => id.Name).Returns(username); 
} 
else 
{ 
    identity.Setup(id => id.IsAuthenticated).Returns(false); 
    identity.Setup(id => id.Name).Returns(string.Empty); 
} 

context.Setup(ctx => ctx.Response.Cache).Returns(CreateCachePolicy()); 
return context.Object; 

}

P.s .: J'utilise Moq

MISE À JOUR:

OMG !! Je ne peux pas le croire! Plus de 2 heures pour comprendre que le problème était une référence à la mauvaise DLL MVC. Je référenais System.Web.Mvc 2.0 pour mon application principale mais System.Web.Mvc 1.0 dans un autre projet. Désolé pour ça!

Répondre

4

Le problème est définitivement ailleurs. Vous n'avez même pas besoin d'initialiser la propriété TempData dans un nouveau dictionnaire de votre test unitaire. Le programme suivant fonctionne correctement:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     TempData["foo"] = "bar"; 
     return View(); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     var controller = new HomeController(); 
     controller.Index(); 
     Console.WriteLine(controller.TempData["foo"]); 
    } 
} 
+0

Merci pour la réponse. Oui, je sais ... J'essayais de voir si le réglage manuel le ferait fonctionner. Mais l'erreur est quelque part entre ces deux méthodes car avant l'exécution de controller.ControllerContext = context, la propriété TempData fonctionne. Donc ... probablement le problème est mon FakeHttpContext. – nepomucenobr

+0

Oui, probablement, mais jusqu'à ce que vous posiez un exemple complet reproduisant le problème, il pourrait être difficile de le comprendre. –

Questions connexes