Voir le flux RSS

Blog de Hinault Romaric (.NET Core, ASP.NET Core, Azure, DevOps)

ASP.NET Core Razor Page : Test unitaire PageModel, ModelState produit une exception de type NullRefException

Noter ce billet
par , 17/11/2017 à 19h49 (105 Affichages)
Je suis en train d’écrire des tests unitaires pour le code d’exemple RazorDemo que j’ai hébergé sur GitHub pour mon dernier tutoriel qui sera publié bientôt.

Actuellement, j’essaye de tester la méthode suivante :

Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
public class CreateModel : PageModel
    {
        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }
            _context.Student.Add(Student);
            await _context.SaveChangesAsync();
            return RedirectToPage("./Index");
        }
    }


Il s’avère que dans mon test unitaire, lorsque je crée une nouvelle instance de CreateModel et que j’appelle la méthode OnPostAsync(), j’obtiens une exception à cause du Model State :

Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
  //Arrange
 var createModel = new CreateModel(Context);
 
 //Act
 var redirect = await createModel.OnPostAsync() as RedirectToPageResult;

Nom : mock.png
Affichages : 22
Taille : 29,4 Ko

Pourtant avec ASP.NET Core MVC, je suis en mesure de procéder de même et n’obtenir aucune erreur :

Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
var controller = new StudentsController(studentsRepositoryMock.Object);
 
// Act
var result = await controller.Create(new Student ()) as ViewResult;

Le problème avec Razor Pages est qu’à l’initialisation d’un objet qui hérite du PageModel, le PageContext est nul. Du coup lorsqu’on essaye de retrouver des informations liées au contexte de la page comme le ModelState, on obtient une exception.

Ce n’est pas le cas avec MVC, car à l’initialisation d’un Contrôleur, si le PageContext est nul, une instance de cette classe est retournée dans le Get.

Les développeurs de ASP.NET Core vont publier un correctif dans la prochaine mise à jour de la plateforme pour offrir un comportement similaire à celui de MVC.

Pour l’instant, pour contourner le problème, il suffit juste d’initialiser soi-même la propriété PageContext :

Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
  //Arrange
    var createModel = new CreateModel(Context);
    createModel.PageContext = new PageContext();
 
   //Act
   var redirect = await createModel.OnPostAsync() as RedirectToPageResult;

Nom : mock1.png
Affichages : 22
Taille : 20,8 Ko

Et c’est réglé.

Envoyer le billet « ASP.NET Core Razor Page : Test unitaire PageModel,  ModelState produit une exception de type NullRefException » dans le blog Viadeo Envoyer le billet « ASP.NET Core Razor Page : Test unitaire PageModel,  ModelState produit une exception de type NullRefException » dans le blog Twitter Envoyer le billet « ASP.NET Core Razor Page : Test unitaire PageModel,  ModelState produit une exception de type NullRefException » dans le blog Google Envoyer le billet « ASP.NET Core Razor Page : Test unitaire PageModel,  ModelState produit une exception de type NullRefException » dans le blog Facebook Envoyer le billet « ASP.NET Core Razor Page : Test unitaire PageModel,  ModelState produit une exception de type NullRefException » dans le blog Digg Envoyer le billet « ASP.NET Core Razor Page : Test unitaire PageModel,  ModelState produit une exception de type NullRefException » dans le blog Delicious Envoyer le billet « ASP.NET Core Razor Page : Test unitaire PageModel,  ModelState produit une exception de type NullRefException » dans le blog MySpace Envoyer le billet « ASP.NET Core Razor Page : Test unitaire PageModel,  ModelState produit une exception de type NullRefException » dans le blog Yahoo

Commentaires