8
votes

TryUpdateModel jette NullReferenceException dans le test de l'unité ASP.NET MVC 3

Depuis que j'ai mis à niveau à partir de MVC 2 à MVC 3 RC, en utilisant TryUpdateModel provoque une nullreferenceException. Ce problème ne se produit que lors de l'exécution de ma méthode d'action dans le cadre d'un test d'unité. Utiliser sur le serveur actuel fonctionne comme prévu.

Voici une trace de pile de l'exception:

System.NullReferenceException: Objet Référence non définie sur une instance d'un objet. à System.web.mvc.jsonvalueproviderFactory.getvalueProvider (ControlContext ControlContext) à System.web.mvc.valueproviderFactoryCollection. <> C_ displayClassc.b _7 (ValueProviderFactory usine) à System.Linq.Enumérable.WheresElectEnterAdator (code> 2.MOvenext () à System.Linq.Enumérable.WheresElectEnterAdator (code> 2.MoVoVoSext () à System.collections.generic.list 1..ctor (iEnumerable 1 collection) à System.linq.enumerable.toliste [Tsource] (iEnumerable`1 source) à System.Web.MVC.ValueProviderFactoryCollection.getvalueProvider (ControlContext ControlContext) à System.web.mvc.controller.ecteur de Tmodel] (Tmodel] modèle, préfixe de chaîne)
... mon propre code d'ici sur ....

Dans le cas où il importe, mon contrôleur a la signature suivante: xxx

Je suppose que cela a à voir avec la nouvelle façon DI fonctionne dans MVC3 , mais je ne peux pas comprendre ce que je fais mal. Il y a peut-être quelque chose en termes de configuration DI qui est requis dans le MVC 3, mais n'était pas nécessaire dans le MVC 2?


0 commentaires

3 Réponses :


1
votes

Il est probablement un changement de mise en œuvre de system.web.mvc.jsonvalueproviderfactory.getvalueprovider code> qui frappe une valeur dans contrôlercontext code> qui est null.

Vous avez peut-être besoin Pour se moquer d'une valeur supplémentaire dans contrôlercontext code>. p>

au moins c'est là que je regarderais d'abord. p>

Modifier P>

Ouais, regarde Comme si cela fait une vérification nulle sur contrôlercontext code>. P>

[TestMethod]
public void EditTest
{
    var controller = new Controller();         
    var controllerContext = new ControllerContext();

    controller.ControllerContext = controllerContext;

    controller.Edit(...);       
}


5 commentaires

Je suppose que presque autant, mais quelle valeur dois-je avoir besoin de se moquer? Et comment puis-je faire cela? Cela semble être un scénario joli commun ...


Un scénario courant pour le tout nouveau code n'est pas ce courant. ;) Pourquoi n'incluez-vous pas vos simulacres actuels et nous pourrions ensuite signaler des ajouts probables? Vous moquez-vous de l'en-tête?


Ouais ne ressemble pas à la source MVC3 est disponible pourtant ... cela pourrait rendre les choses peu plus difficiles. Je vais charger le réflecteur et voir ce que je peux trouver.


Si vous êtes unitaire Test une méthode qui appelle UpdateModel, vous devez définir la propriété Controller.ValueProvider manuellement avant d'exécuter le test. Je vous recommanderais de la définir à une instance de SimpleValueProvider, qui est juste une name de fantaisieValuecollection.


Je devais ajouter à la fois un ValueProvider et un ControlContext



15
votes

Vous devez ajouter ce code: xxx

J'ai le même problème et ce code m'aide.


0 commentaires

2
votes

Si quelqu'un d'autre a le même problème et trouve ce message:

J'ai résolu le problème génériquement basé sur la réponse de Ivan Kortym (merci!), avec la pièce de code suivante dans mon constructeur de classe de contrôle de contrôleur: P >

if (Request!=null && Request.Form != null && Request.Form.HasKeys() && ValueProvider == null)
{
    ValueProvider = new FormCollection(Request.Form).ToValueProvider();
}


2 commentaires

Ce n'est pas une bonne idée, car vous ajoutez du code pour faciliter les tests dans le code de production. Il est également exécuté sur chaque demande et il est totalement inutile.


Pourquoi ne pas simplement utiliser le "fournisseur de valeur = ..." Ligne dans la configuration de votre contrôleur dans vos tests d'unité.