Aller au contenu principal

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).

  1. Sous Snowfall.Tests/Web.Api/TestsUnitaires -> Add -> Class/Interface

  2. Nommer la classe EvenementsTests

  3. Créer le test Obtenir_ListeEvenements_RetourneOk et le constructeur

    Snowfall.Tests/Web.Api/TestsUnitaires/EvenementsTests.cs
    public 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);
    }
    }
    info

    On 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é:

Snowfall.Tests/Web.Api/TestsUnitaires/EvenementsTests.cs
[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);
}