Test unitaire API Web ASP.NET 2

par Tom FitzMacken

Télécharger le projet terminé

Ces conseils et cette application montrent comment créer des tests unitaires simples pour votre application API Web 2. Ce tutoriel montre comment inclure un projet de test unitaire dans votre solution et écrire des méthodes de test qui case activée les valeurs retournées à partir d’une méthode de contrôleur.

Ce didacticiel part du principe que vous êtes familiarisé avec les concepts de base de API Web ASP.NET. Pour un tutoriel d’introduction, consultez Prise en main avec API Web ASP.NET 2.

Les tests unitaires de cette rubrique sont intentionnellement limités aux scénarios de données simples. Pour des scénarios de test unitaire de données plus avancés, consultez Mocking Entity Framework lors des tests unitaires API Web ASP.NET 2.

Versions logicielles utilisées dans le tutoriel

Dans cette rubrique

Cette rubrique contient les sections suivantes :

Prérequis

Visual Studio 2017 Édition Communauté, Professionnel ou Entreprise

Télécharger le code

Téléchargez le projet terminé. Le projet téléchargeable inclut le code de test unitaire pour cette rubrique et pour la rubrique Mocking Entity Framework lors des tests unitaires API Web ASP.NET.

Créer une application avec un projet de test unitaire

Vous pouvez créer un projet de test unitaire lors de la création de votre application ou ajouter un projet de test unitaire à une application existante. Ce tutoriel montre les deux méthodes pour créer un projet de test unitaire. Pour suivre ce tutoriel, vous pouvez utiliser l’une ou l’autre approche.

Ajouter un projet de test unitaire lors de la création de l’application

Créez une application web ASP.NET nommée StoreApp.

créer un projet

Dans les fenêtres Nouveau projet ASP.NET, sélectionnez le modèle Vide et ajoutez des dossiers et des références principales pour l’API web. Sélectionnez l’option Ajouter des tests unitaires . Le projet de test unitaire est automatiquement nommé StoreApp.Tests. Vous pouvez conserver ce nom.

créer un projet de test unitaire

Après avoir créé l’application, vous verrez qu’elle contient deux projets.

deux projets

Ajouter un projet de test unitaire à une application existante

Si vous n’avez pas créé le projet de test unitaire lors de la création de votre application, vous pouvez en ajouter un à tout moment. Par exemple, supposons que vous disposez déjà d’une application nommée StoreApp et que vous souhaitez ajouter des tests unitaires. Pour ajouter un projet de test unitaire, cliquez avec le bouton droit sur votre solution, puis sélectionnez Ajouter et nouveau projet.

ajouter un nouveau projet à la solution

Sélectionnez Test dans le volet gauche, puis sélectionnez Projet de test unitaire pour le type de projet. Nommez le projet StoreApp.Tests.

ajouter un projet de test unitaire

Le projet de test unitaire s’affiche dans votre solution.

Dans le projet de test unitaire, ajoutez une référence de projet au projet d’origine.

Configurer l’application API web 2

Dans votre projet StoreApp, ajoutez un fichier de classe au dossier Models nommé Product.cs. Remplacez le contenu du fichier par le code suivant.

using System;

namespace StoreApp.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
}

Générez la solution.

Cliquez avec le bouton droit sur le dossier Contrôleurs, puis sélectionnez Ajouter et nouveau élément de structure. Sélectionnez Contrôleur d’API web 2 - Vide.

ajouter un nouveau contrôleur

Définissez le nom du contrôleur sur SimpleProductController, puis cliquez sur Ajouter.

spécifier le contrôleur

Remplacez le code existant par le code ci-dessous. Pour simplifier cet exemple, les données sont stockées dans une liste plutôt que dans une base de données. La liste définie dans cette classe représente les données de production. Notez que le contrôleur inclut un constructeur qui prend comme paramètre une liste d’objets Product. Ce constructeur vous permet de réussir les données de test lors d’un test unitaire. Le contrôleur inclut également deux méthodes asynchrones pour illustrer les méthodes asynchrones de test unitaire. Ces méthodes asynchrones ont été implémentées en appelant Task.FromResult pour réduire le code superflu, mais normalement, les méthodes incluent des opérations nécessitant beaucoup de ressources.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web.Http;
using StoreApp.Models;

namespace StoreApp.Controllers
{
    public class SimpleProductController : ApiController
    {
        List<Product> products = new List<Product>();        
           
        public SimpleProductController() { }

        public SimpleProductController(List<Product> products)
        {
            this.products = products;
        }

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public async Task<IEnumerable<Product>> GetAllProductsAsync()
        {
            return await Task.FromResult(GetAllProducts());
        }

        public IHttpActionResult GetProduct(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                return NotFound();
            }
            return Ok(product);
        }

        public async Task<IHttpActionResult> GetProductAsync(int id)
        {
            return await Task.FromResult(GetProduct(id));
        }
    }
}

La méthode GetProduct retourne une instance de l’interface IHttpActionResult. IHttpActionResult est l’une des nouvelles fonctionnalités de l’API Web 2 et simplifie le développement de tests unitaires. Les classes qui implémentent l’interface IHttpActionResult se trouvent dans l’espace de noms System.Web.Http.Results . Ces classes représentent les réponses possibles d’une demande d’action et elles correspondent à des codes status HTTP.

Générez la solution.

Vous êtes maintenant prêt à configurer le projet de test.

Installer des packages NuGet dans un projet de test

Lorsque vous utilisez le modèle Vide pour créer une application, le projet de test unitaire (StoreApp.Tests) n’inclut aucun package NuGet installé. D’autres modèles, tels que le modèle d’API web, incluent des packages NuGet dans le projet de test unitaire. Pour ce tutoriel, vous devez inclure le package Microsoft API Web ASP.NET 2 Core au projet de test.

Cliquez avec le bouton droit sur le projet StoreApp.Tests et sélectionnez Gérer les packages NuGet. Vous devez sélectionner le projet StoreApp.Tests pour ajouter les packages à ce projet.

gérer les packages

Recherchez et installez le package Microsoft API Web ASP.NET 2 Core.

installer le package principal de l’API web

Fermez la fenêtre Gérer les packages NuGet.

Créer des tests

Par défaut, votre projet de test inclut un fichier de test vide nommé UnitTest1.cs. Ce fichier affiche les attributs que vous utilisez pour créer des méthodes de test. Pour vos tests unitaires, vous pouvez utiliser ce fichier ou créer votre propre fichier.

UnitTest1

Pour ce tutoriel, vous allez créer votre propre classe de test. Vous pouvez supprimer le fichier UnitTest1.cs. Ajoutez une classe nommée TestSimpleProductController.cs et remplacez le code par le code suivant.

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Web.Http.Results;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using StoreApp.Controllers;
using StoreApp.Models;

namespace StoreApp.Tests
{
    [TestClass]
    public class TestSimpleProductController
    {
        [TestMethod]
        public void GetAllProducts_ShouldReturnAllProducts()
        {
            var testProducts = GetTestProducts();
            var controller = new SimpleProductController(testProducts);

            var result = controller.GetAllProducts() as List<Product>;
            Assert.AreEqual(testProducts.Count, result.Count);
        }

        [TestMethod]
        public async Task GetAllProductsAsync_ShouldReturnAllProducts()
        {
            var testProducts = GetTestProducts();
            var controller = new SimpleProductController(testProducts);

            var result = await controller.GetAllProductsAsync() as List<Product>;
            Assert.AreEqual(testProducts.Count, result.Count);
        }

        [TestMethod]
        public void GetProduct_ShouldReturnCorrectProduct()
        {
            var testProducts = GetTestProducts();
            var controller = new SimpleProductController(testProducts);

            var result = controller.GetProduct(4) as OkNegotiatedContentResult<Product>;
            Assert.IsNotNull(result);
            Assert.AreEqual(testProducts[3].Name, result.Content.Name);
        }

        [TestMethod]
        public async Task GetProductAsync_ShouldReturnCorrectProduct()
        {
            var testProducts = GetTestProducts();
            var controller = new SimpleProductController(testProducts);

            var result = await controller.GetProductAsync(4) as OkNegotiatedContentResult<Product>;
            Assert.IsNotNull(result);
            Assert.AreEqual(testProducts[3].Name, result.Content.Name);
        }

        [TestMethod]
        public void GetProduct_ShouldNotFindProduct()
        {
            var controller = new SimpleProductController(GetTestProducts());

            var result = controller.GetProduct(999);
            Assert.IsInstanceOfType(result, typeof(NotFoundResult));
        }

        private List<Product> GetTestProducts()
        {
            var testProducts = new List<Product>();
            testProducts.Add(new Product { Id = 1, Name = "Demo1", Price = 1 });
            testProducts.Add(new Product { Id = 2, Name = "Demo2", Price = 3.75M });
            testProducts.Add(new Product { Id = 3, Name = "Demo3", Price = 16.99M });
            testProducts.Add(new Product { Id = 4, Name = "Demo4", Price = 11.00M });

            return testProducts;
        }
    }
}

Exécuter les tests

Vous êtes maintenant prêt à exécuter les tests. Toutes les méthodes marquées avec l’attribut TestMethod seront testées. À partir de l’élément de menu Test , exécutez les tests.

exécuter des tests

Ouvrez la fenêtre Test Explorer et notez les résultats des tests.

résultats de test

Résumé

Vous avez terminé ce didacticiel. Les données de ce tutoriel ont été intentionnellement simplifiées pour se concentrer sur les conditions de test unitaire. Pour des scénarios de test unitaire de données plus avancés, consultez Mocking Entity Framework lors des tests unitaires API Web ASP.NET 2.