Photo par Sieuwert Otterloo

Tests unitaires des requêtes en multipart dans vos Azure Functions C#

Mocker de votre requête multipart facilement !

Créé par Damien Aicheh le 10/02/2022 · 6 mins

Lorsque vous créez un déclencheur HTTP Azure Functions, vous devez parfois envoyer des fichiers à l’aide de requêtes en plusieurs parties appelées multipart requests. Mais comment tester cela unitairement ? C’est ce que nous allons découvrir dans ce tutoriel.

Example de base

Supposons que nous ayons une Azure Function qui reçoit des données en multiparts. Nous avons deux types de données dans cet exemple: du json et un fichier.

Le code ressemblera à ceci :

public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req)
{
    var reqFormData = await req.ReadFormAsync();

    string data = reqFormData["data"];
    if (data == null)
    {
        return new BadRequestObjectResult(Errors.DATA_NOT_PROVIDED);
    }

    var file = reqFormData.Files["myFile"];
    if (file == null)
    {
        return new BadRequestObjectResult(Errors.FILE_NOT_PROVIDED);
    }

    // Do whatever you want with the data and files...

    return new OkObjectResult("This HTTP triggered function executed successfully.");
}

Comme vous pouvez le voir, nous lisons les informations du request form, puis nous sommes en mesure de vérifier si les données sont bonnes ou non, puis de les utiliser ensuite dans l’Azure Function.

Cela étant dit, comment tester cette fonction Run ?

Mocker la multipart request

Le point clé ici est de savoir comment mocker la requête Http et renvoyer les données en multipart que nous voulons. Pour ce faire, nous allons créer une classe HttpHelper et y ajouter deux méthodes :

  • Un pour créer la requête multipart que nous appellerons CreateMultipartRequest
  • L’autre sera responsable de la création du fichier de la requête multipart et s’appellera CreateFormFile
public static DefaultHttpRequest CreateMultipartRequest(FormCollection formCollection)
{
    var request = new DefaultHttpRequest(new DefaultHttpContext())
    {
        Method = "POST",
        ContentType = "multipart/form-data",
        Form = formCollection,
    };

    return request;
}

La méthode ci-dessus prend un FormCollection qui contiendra le json et le fichier pour votre requête. La seconde ci-dessous simulera un fichier pour votre requête multipart.

public static IFormFile CreateFormFile(string keyname, string filePath, string contentType)
{
    using (var stream = File.OpenRead(filePath))
        return new FormFile(stream, 0, stream.Length, keyname, filePath)
        {
            Headers = new HeaderDictionary(),
            ContentType = contentType
        };
}

Avec cela prêt, voyons-le en action!

Tests unitaires

Dans l’exemple de code ci-dessous, nous pouvons maintenant tester si nos données et notre fichier json déclenchent les bonnes méthodes de notre point de terminaison Azure Function.

[Fact]
public async Task TestRun_AllDataProvidedCorrectly_ReturnOkObjectResult()
{
    // Arrange
    var formFileCollection = new FormFileCollection();
    formFileCollection.Add(HttpHelper.CreateFormFile("myFile", "Assets/demo.png", "image/png"));

    var formCollection = new FormCollection(new Dictionary<string, Microsoft.Extensions.Primitives.StringValues>()
    {
        { "data", "My data" },
    }, formFileCollection);
    var request = HttpHelper.CreateMultipartRequest(formCollection);

    // Act
    var result = (ObjectResult)await _sut.Run(request);

    // Assert
    Assert.NotNull(result);
    Assert.IsType<OkObjectResult>(result);
    Assert.Equal(result.StatusCode, 200);
}

Dans la section Arrange, nous créons la requête multipart pour une image appelée demo.png qui est disponible dans un dossier Assets de notre projet. N’oubliez pas de le déclarer en tant que EmbeddedResource dans votre csproj comme ceci :

<ItemGroup>
  <EmbeddedResource Include="Assets\demo.png">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </EmbeddedResource>
</ItemGroup>

Ensuite, nous créons un objet FormCollection et ajoutons l’image en tant que FormFile à la requête.

Ensuite, dans la section Act, nous pouvons lancer la requête et dans la section Assert, nous vérifions le résultat attendu.

Touche finale

Vous savez maintenant comment effectuer des tests unitaires sur vos requêtes multipart de vos Azure Functions. Bien sûr, vous pouvez améliorer les méthodes du helper avec vos propres cas d’usages. Vous trouverez un exemple complet dans ce répertoire Github avec plusieurs tests unitaires.

Happy coding!

Vous avez aimé ce tutoriel ? Laissez une étoile sur le répertoire Github associé !

N'hésitez pas à me suivre sur pour ne pas rater mon prochain tutoriel !