- Azure
- Azure Functions
- Dotnet
- Unit Tests
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.
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
?
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 :
CreateMultipartRequest
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!
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.
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é !