ASP.NET Core Razor Page : Test unitaire PageModel, ModelState produit une exception de type NullRefException
par
, 17/11/2017 à 18h49 (797 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;
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;
Et c’est réglé.