Comment correctement tester le contrôleur Web Api avec les résultats IEnumerable?

La question initiale était un peu incorrecte, car le problème ne survient que pendant les tests du contrôleur. Comment renvoyer le code d’état correct lorsque l’énumération de IEnumerable échoue. ASP.NET WebApi

La question est de savoir comment tester correctement le contrôleur API Web qui renvoie IEnumerable lorsque IEnumerable peut générer une exception lors d’une exécution différée.

Par exemple, j’ai un tel sharepoint terminaison API:

public class EntityController : ApiController { ... public IHttpActionResult Get() { return Ok(Session.Query()); } } 

Et le test correspondant passera toujours indépendamment de l’exception pouvant être levée lors de l’exécution de la requête.

 [Test] public async Task Test() { var entityController = new EntityController(Session) { Configuration = new HttpConfiguration(), Request = new HttpRequestMessage() }; var response = await entityController.GetAll().ExecuteAsync(new CancellationTokenSource().Token); response.EnsureSuccessStatusCode(); } 

Cependant, ce test ne réussira pas si on transforme ToList à l’intérieur du contrôleur.

 public class EntityController : ApiController { ... public IHttpActionResult Get() { return Ok(Session.Query().ToList()); } } 

Il me semble que vous souhaitez créer des tests d’intégration pour tester vos points finaux d’API Web.

Votre test actuel ne rencontrera jamais un formateur de type de média ou d’autres parties du pipeline d’api Web où des problèmes peuvent survenir.

Je vous recommande d’utiliser le package de nuget Microsoft.Owin.Testing dans votre projet de test. Cela vous permettra de configurer votre contrôleur d’API Web sur un serveur Web en mémoire à des fins de test, ce qui couvrira une plus grande partie du pipeline d’API Web.

À en juger par votre extrait de code, votre contrôleur d’API Web ne dépend pas de System.Web conséquent, l’utilisation de OWIN à des fins de test peut répondre à vos besoins. Bien entendu, cela ne couvre aucun élément spécifique à votre configuration IIS ni aucun élément du pipeline IIS en dehors de l’API Web. Cependant, les exceptions générées par l’exécution différée de votre Linq query seront interceptées si vous n’utilisez pas ToList() dans l’action de votre contrôleur.

Pour utiliser les tests Owin et Owin, vous devez suivre ces étapes:

1. Ajoutez le package Microsoft.Owin nuget au projet Web contenant les contrôleurs d’API Web à tester.

2. Ajoutez une classe Owin Startup à ce projet Web:

 public class Startup { public virtual void Configuration(IAppBuilder builder) { // if you want to move all your web api initialization // and configuration to here then you can. // Otherwise just leave this method empty } } 

Nous allons remplacer la méthode de Configuration dans le projet de test.

3. Ajoutez le package de nuget Microsoft.AspNet.WebApi.Owin à votre projet de test.

4. Ajoutez le package de nuget Microsoft.Owin.Testing à votre projet de test.

5. Créez une classe de test dans votre projet de test:

 public class TestClass { private class TestStartup : Startup { public override void Configuration(IAppBuilder app) { // do your web api, IoC, etc setup here var config = new HttpConfiguration(); config.MapHttpAtsortingbuteRoutes(); // ...etc app.UseWebApi(config); } } [Test] public void MyTest() { // arrange using (var server = TestServer.Create()) { // act var response = server.CreateRequest("api/someroute/").GetAsync().Result; // verify Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); } } } 

Assurez-vous que la classe interne TestStartup dérive de la classe Startup créée dans votre projet Web à la deuxième étape. Ainsi, l’API Web récupérera vos contrôleurs dans le projet Web. Il existe d’autres méthodes, mais cela est simple et présente l’avantage de pouvoir réutiliser le code d’initialisation de l’application réelle si vous utilisiez Owin.

6. bénéfice