Je crée des tests unitaires pour ma classe ASP .NET MVC Controller et je suis tombé sur quelques erreurs étranges:problèmes dans la création de test unitaire pour ASP .NET MVC
Mon code de commande est ci-dessous:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Delete(JournalViewModel journal)
{
var selectedJournal = Mapper.Map<JournalViewModel, Journal>(journal);
var opStatus = _journalRepository.DeleteJournal(selectedJournal);
if (!opStatus.Status)
throw new System.Web.Http.HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
return RedirectToAction("Index");
}
Mon code de test est ci-dessous:
[TestMethod]
public void Delete_Journal()
{
// Arrange
// Simulate PDF file
HttpPostedFileBase mockFile = Mock.Create<HttpPostedFileBase>();
Mock.Arrange(() => mockFile.FileName).Returns("Test.pdf");
Mock.Arrange(() => mockFile.ContentLength).Returns(255);
// Create view model to send.
JournalViewModel journalViewModel = new JournalViewModel();
journalViewModel.Id = 1;
journalViewModel.Title = "Test";
journalViewModel.Description = "TestDesc";
journalViewModel.FileName = "TestFilename.pdf";
journalViewModel.UserId = 1;
journalViewModel.File = mockFile; // Add simulated file
Mock.Arrange(() => journalRepository.DeleteJournal(null)).Returns(new OperationStatus
{
Status = true
});
// Act
PublisherController controller = new PublisherController(journalRepository, membershipRepository);
RedirectToRouteResult result = controller.Delete(journalViewModel) as RedirectToRouteResult;
// Assert
Assert.AreEqual(result.RouteValues["Action"], "Index");
}
problème 1 - cartographie Exception:
Chaque fois que je lance mon test, je l'exception suivante:
Nom du test: test Delete_Journal
FullName: Journals.Web.Tests.Controllers.PublisherControllerTest.Delete_Journal
Source Test: \ Source \ Journaux .Web.Tests \ Controllers \ PublisherControllerTest.cs : ligne 132
Résultat d'essai: Durée de l'essai a échoué: 0: 00: 00,3822468Résultat StackTrace: à Journals.Web.Controllers.PublisherController.Delete (J Journal ournalViewModel ) dans \ Source \ Journals.Web \ contrôleurs \ PublisherController.cs: ligne 81 à Journals.Web.Tests.Controllers.PublisherControllerTest.Delete_Journal() dans \ Source \ Journals.Web.Tests \ Controllers \ PublisherControllerTest.cs: ligne 156 Résultat message: méthode d'essai Journals.Web.Tests.Controllers.PublisherControllerTest.Delete_Journal a jeté exception: AutoMapper.AutoMapperMappingException: Type manquant configuration de la carte ou la cartographie non pris en charge.
types de cartographie: JournalViewModel -> Journal Journals.Model.JournalViewModel -> Journals.Model.Journal
Chemin de destination: Journal
valeur Source: Journals.Model.JournalViewModel
Il semble qu'il y ait un problème de mappage entre les classes JournalViewModel
et Journal
, mais je ne sais pas où c'est. J'ai ajouté ce code à la Application_Start
dans Global.asax.cs
:
Mapper.CreateMap<Journal, JournalViewModel>();
Mapper.CreateMap<JournalViewModel, Journal>();
et la cartographie de Journal
à JournalViewModel
fonctionne.
En fin de compte j'ai essayé d'ajouter Mapper.CreateMap<JournalViewModel, Journal>();
comme la première ligne de la méthode Delete
et puis tout fonctionne, mais je ne sais pas pourquoi.
Problème 2 - HTML Exception
Une fois la mise en correspondance est en cours d'exécution avec la solution de contournement ci-dessus, j'ai un problème dans lequel la propriété Status
de var opStatus = _journalRepository.DeleteJournal(selectedJournal);
est toujours faux, même si je Mock pour modifier et faire c'est toujours vrai. Cela provoque le lancement d'une exception HTML qui ne devrait pas se produire.
EDIT
j'ai changé dans mon Application_Start à:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Journal, JournalViewModel>();
cfg.CreateMap<JournalViewModel, Journal>();
});
Mais je toujours la même erreur.
EDIT - Problème 2 Résolu
Il se trouve que j'ai oublié d'ajouter le mappage à ma classe de test unitaire, donc je ne les suivantes:
[TestInitialize]
public void TestSetup()
{
// Create necessary mappings
Mapper.CreateMap<Journal, JournalViewModel>();
Mapper.CreateMap<JournalViewModel, Journal>();
//...other code omitted for brevity
}
Et il se trouve que cette était la source du problème. Je pense que puisque le Global.asax.cs Application_Start() n'est jamais appelé dans les tests unitaires, le Mapping n'est jamais créé, donc j'ai dû le faire moi-même lors de l'initialisation des tests unitaires.
Vous avez probablement une sorte de 'TestBase' classe wh Avant d'appeler votre code de configuration de mappage. Le 'Mapper 'statique dans votre test ne sait rien de la configuration de mappage de votre' Global.asax.cs'. –
Je suggère d'utiliser une méthode statique pour créer toutes les cartes, puis appeler cette méthode statique dans le cadre de votre configuration de test. En ce qui concerne le deuxième problème, pourriez-vous me dire ce qu'est JournalRepository. L'adoptez-vous comme une dépendance? –
Quelle version d'Automapper utilisez-vous?Je suggère d'utiliser des abstractions ('IMapper') à la place de l'API statique car vous avez déjà découvert les difficultés dans les tests unitaires des API statiques – Nkosi