3

Depuis que j'ai mis à jour vers ASP.NET MVC 3 Beta 1, j'obtiens un NullReferenceException chaque fois que j'appelle TryUpdateModel() pendant une session de test unitaire.ASP.NET MVC 3 beta: TryUpdateModel renvoie NullreferenceException dans le test unitaire

La trace de la pile ressemble à ceci:

Execute System.NullReferenceException: référence d'objet non définie à une instance d'un objet. à System.Web.Mvc.JsonValueProviderFactory.GetValueProvider (ControllerContext controllerContext) à System.Web.Mvc.ValueProviderFactoryCollection. <> c_ DisplayClassc.b _7 (usine ValueProviderFactory) à System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() à System.Collections.Generic.List 1..ctor(IEnumerable une collection) à System.Linq.Enumerable.ToList [TSource] (IEnumerable 1 source) at System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext) at System.Web.Mvc.ControllerBase.get_ValueProvider() at Zeiterfassung.Controllers.ControllerBase 1.TryUpdateModelAndTrackChanges [TModel] (modèle TModel, préfixe de chaîne) dans C: \ Utilisateurs \ Adrian \ Documents \ Sites \ Zeiterfassung \ Zeiterfassung \ Contrôleurs \ ControllerBase.cs: ligne 164 ... Mon propre code à partir d'ici ...

La même méthode d'action fonctionne très bien lors de l'exécution sur le serveur Web, donc je suppose que t C'est un problème avec Dependency Injection dans les tests unitaires.

Y at-il quelque chose que je dois configurer pour que cela fonctionne? Je préfère ne pas revenir à la précédente version ASP.NET MVC si possible.

Répondre

2

Vous devez vous moquer du ControllerContext. Personnellement, je l'utilise MvcContrib.TestHelper qui est basé sur Rhino Mocks pour y parvenir:

// arrange 
var controller = new HomeController(); 
new TestControllerBuilder().InitializeController(controller); 

// act 
var actual = controller.Index(); 

mais tout cadre moqueur pourrait faire le travail. Vous avez juste besoin de vous assurer que dans votre test unitaire controller.ControllerContext n'est pas nul.

0

Si vous utilisez Rhino Mocks seul (sans MvcContrib.TestHelper), procédez comme suit:

controller = new HomeController(repository); 
controller.ControllerContext = MockRepository.GenerateStub<ControllerContext>(); 

Personnellement, je crée en fait une variable de niveau de classe de test:

private HomeController controller; 

Ensuite, pour chaque test I réinitialiser cette variable:

[TestInitialize()] 
public void MyTestInitialize() 
{ 
    controller = new HomeController(); 
    controller.ControllerContext = MockRepository.GenerateStub<ControllerContext>(); 
}