Comment puis-je tester la méthode d’action Web Api lorsqu’elle renvoie IHttpActionResult?

Supposons que c’est ma méthode d’action

public IHttpActionResult Get(int id) { var status = GetSomething(id); if (status) { return Ok(); } else { return NotFound(); } } 

Test sera

 var httpActionResult = controller.Get(1); 

Comment puis-je vérifier mon code de statut http après cela?

Ici Ok() est juste une aide pour le type OkResult qui définit le statut de la réponse comme étant HttpStatusCode.Ok … donc vous pouvez simplement vérifier si l’instance de votre résultat d’action est un OkResult … quelques exemples (écrits en XUnit ) :

 // if your action returns: NotFound() IHttpActionResult actionResult = valuesController.Get(10); Assert.IsType(actionResult); // if your action returns: Ok() actionResult = valuesController.Get(11); Assert.IsType(actionResult); // if your action was returning data in the body like: Ok("data: 12") actionResult = valuesController.Get(12); OkNegotiatedContentResult conNegResult = Assert.IsType>(actionResult); Assert.Equal("data: 12", conNegResult.Content); // if your action was returning data in the body like: Content(HttpStatusCode.Accepted, "some updated data"); actionResult = valuesController.Get(13); NegotiatedContentResult negResult = Assert.IsType>(actionResult); Assert.Equal(HttpStatusCode.Accepted, negResult.StatusCode); Assert.Equal("some updated data", negResult.Content); 

Il est temps de ressusciter une question morte

Les réponses actuelles reposent toutes sur la conversion de l’object réponse en un type connu. Malheureusement, les réponses ne semblent pas avoir une hiérarchie utilisable ou un chemin de conversion implicite pour que cela fonctionne sans connaissance approfondie de l’implémentation du contrôleur. Considérer ce qui suit:

 public class MixedCodeStandardController : ApiController { public readonly object _data = new Object(); public IHttpActionResult Get() { return Ok(_data); } public IHttpActionResult Get(int id) { return Content(HttpStatusCode.Success, _data); } } 

Test de la classe:

 var testController = new MixedCodeStandardController(); var getResult = testController.Get(); var posRes = getResult as OkNegotiatedContentResult; Assert.IsType>(getResult); Assert.AreEqual(HttpStatusCode.Success, posRes.StatusCode); Assert.AreEqual(testController._data, posRes.Content); var idResult = testController.Get(1); var oddRes = getResult as OkNegotiatedContentResult; // oddRes is null Assert.IsType>(idResult); // throws failed assertion Assert.AreEqual(HttpStatusCode.Success, oddRes.StatusCode); // throws for null ref Assert.AreEqual(testController._data, oddRes.Content); // throws for null ref 

En dehors de la boîte noire, le stream de réponse est essentiellement le même. Le test doit savoir comment le contrôleur a mis en œuvre l’appel de retour pour le tester de cette manière.

Au lieu de cela, utilisez l’object HttpResponseMessage du IHttpActionResult renvoyé. Cela garantit que le test peut être cohérent, même si le code du contrôleur peut ne pas être:

 var testController = new MixedCodeStandardController(); var getResult = testController.Get(); var getResponse = getResult.ExecuteAsync(CancellationToken.None).Result; Assert.IsTrue(getResponse.IsSuccessStatusCode); Assert.AreEqual(HttpStatusCode.Success, getResponse.StatusCode); var idResult = testController.Get(1); var idResponse = idResult.ExecuteAsync(CancellationToken.None).Result; Assert.IsTrue(idResponse.IsSuccessStatusCode); Assert.AreEqual(HttpStatusCode.Success, idResponse.StatusCode); 

Ceci est la réponse acceptée par Kiran Challa, adaptée pour NUnit;

 var valuesController = controller; // if your action returns: NotFound() IHttpActionResult actionResult = valuesController.Get(10); var notFoundRes = actionResult as NotFoundResult; Assert.IsNotNull(notFoundRes); // if your action returns: Ok() actionResult = valuesController.Get(11); var posRes = actionResult as OkResult; Assert.IsNotNull(posRes); // if your action was returning data in the body like: Ok("data: 12") actionResult = valuesController.Get(12); var conNegResult = actionResult as OkNegotiatedContentResult; Assert.IsNotNull(conNegResult); Assert.AreEqual("data: 12", conNegResult.Content); // if your action was returning data in the body like: Content(HttpStatusCode.Accepted, "some updated data"); actionResult = valuesController.Get(13); var negResult = actionResult as NegotiatedContentResult; Assert.IsNotNull(negResult); Assert.AreEqual(HttpStatusCode.Accepted, negResult.StatusCode); Assert.AreEqual("some updated data", negResult.Content); 

Si IHttpActionResult contient un object JSON, par exemple {“token”: “A”}, nous pouvons utiliser le code suivant.

  var result = usercontroller.GetLogin("user", "password"); Assert.IsInstanceOfType(result, typeof(OkNegotiatedContentResult>)); var content = result as OkNegotiatedContentResult >; Assert.AreEqual("A", content.Content["token"]);