3-3 Tests unitaires (API)
Test unitaire simple pour la liste d'événements
Un test unitaire d'API pour obtenir une liste d'événements sera très proche du test unitaire de la page d'accueil côté MVC
.
On simule les services requis (IEvenementService
et IFileStorage
), puis on valide que le résultat est de type OkObjectResult
, et assignable au type List<EvenementDto>
et que le nombre d'éléments dans la liste retournée correspond au nombre d'éléments retourné par le service (1).
-
Sous
Snowfall.Tests/Web.Api/TestsUnitaires
->Add
->Class/Interface
-
Nommer la classe
EvenementsTests
-
Créer le test
Obtenir_ListeEvenements_RetourneOk
et le constructeurSnowfall.Tests/Web.Api/TestsUnitaires/EvenementsTests.cspublic class EvenementsTests
{
private readonly IMapper _mapper;
public EvenementsTests()
{
var config = new MapperConfiguration(opts => {
opts.AddProfile<AutoMapperConfig>();
});
_mapper = config.CreateMapper();
}
[Fact]
public async Task Obtenir_ListeEvenements_RetourneOk()
{
var evenements = new List<Evenement>
{
new Evenement
{
Id = 1,
Nom = "Evenement",
Capacite = 100,
Date = DateTime.Today,
Description = "Description",
Prix = new Decimal(9.99),
VilleId = 1
}
};
var mockEvenementService = new Mock<IEvenementService>();
var mockFileStorage = new Mock<IFileStorage>();
mockEvenementService.Setup(x => x.GetAll()).ReturnsAsync(evenements);
mockFileStorage.Setup(x => x.SauvegarderFichier(It.IsAny<IFormFile>())).ReturnsAsync($"{new System.Guid().ToString()}.png");
var controller = new EvenementsController(mockEvenementService.Object, mockFileStorage.Object, _mapper);
var resultat = await controller.Index();
var resultatOk = Assert.IsType<OkObjectResult>(resultat);
var evenementsRetour = Assert.IsAssignableFrom<List<EvenementDto>>(resultatOk.Value);
Assert.Equal(evenements.Count, evenementsRetour.Count);
}
}infoOn doit manuellement créer l'objet
_mapper
de AutoMapper puisque nous n'avons plus accès à l'injection de dépendances en tests unitaires.
Test unitaire de création
Pour la création, on fonctionne sensiblement de la même façon, mais on appelle la fonction Create
et on vérifie qu'un événement possédant le même Nom
(et potentiellement d'autres propriétés) que le DTO soumit est retourné:
[Fact]
public async Task Creer_EvenementValide_RetourneOk()
{
// Arrange
var creerEvenementDto = new CreerEvenementDto
{
Nom = "Evenement",
Capacite = 100,
Date = DateTime.Today,
Description = "Description",
Prix = new Decimal(9.99),
VilleId = 1
};
var evenement = _mapper.Map<Evenement>(creerEvenementDto);
var mockEvenementService = new Mock<IEvenementService>();
var mockFileStorage = new Mock<IFileStorage>();
mockEvenementService.Setup(s => s.Create(It.IsAny<Evenement>())).ReturnsAsync(evenement);
mockFileStorage.Setup(x => x.SauvegarderFichier(It.IsAny<IFormFile>())).ReturnsAsync($"{new System.Guid().ToString()}.png");
// Act
var controller = new EvenementsController(mockEvenementService.Object, mockFileStorage.Object, _mapper);
var result = await controller.Create(creerEvenementDto);
// Assert
var resultatOk = Assert.IsType<OkObjectResult>(result);
var evenementRetour = Assert.IsAssignableFrom<EvenementDto>(resultatOk.Value);
Assert.Equal(evenement.Nom, evenementRetour.Nom);
}