IHttpActionResult et les Tests d'Intégration Web API v2 de Mettre en MS Test
VS2013 auto généré une web api v2 contrôleur pour me base sur mon EF contexte. Je suis en train de test de l'unité de la placer une partie de la manette. Peu importe ce que je fais je ne peux pas obtenir mon affirme pour vérifier la StatusCodeResult retour. La génération automatique de code ressemble à ceci:
//PUT api/Vendor/5
public IHttpActionResult PutVendor(int id, Vendor vendor)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != vendor.Id)
{
return BadRequest();
}
db.Entry(vendor).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!VendorExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
Mon test d'Intégration ressemble à ceci:
[TestMethod]
public void PutVendor_UpdateVendorRecord_ReturnsTrue()
{
//Arrange
//CleanUpVendors();
var controller = new VendorController(ctx);
const string vendorName = "Unit Test Company";
//Add vendor to database
ctx.Vendors.Add(new Vendor { Active = true, Name = vendorName });
ctx.SaveChanges();
var myVendor = (from v in ctx.Vendors
where v.Name == vendorName
select v).FirstOrDefault();
//Get Newly Inserted ID
Assert.IsNotNull(myVendor, "Vendor is Null");
myVendor.Name = "New Name";
//Act
var httpActionResult = controller.PutVendor(myVendor.Id, myVendor);
//var response = httpActionResult as OkNegotiatedContentResult<Vendor>;
var response = httpActionResult as OkNegotiatedContentResult<Vendor>;
//Assert
}
Est-il quelque chose de mal avec mon test? Que dois-je Affirme ressembler?
Cette assertion renvoie true:
Assert.IsInstanceOfType(httpActionResult, typeof(System.Web.Http.Results.StatusCodeResult));
mais je ne pense pas que c'est en fait les tests de rien, sauf qu'il y avait une sorte de retour. Toute aide serait grandement appréciée.
Êtes-vous à l'aide d'une véritable base de données pour enregistrer les modifications?
Oui, il est câblé via Entity Framework 6.0.1.
La seule raison pour laquelle je intenter un procès à une vraie base de données du moment, c'est parce que je ne peux pas obtenir de l'Effort (.NET dans la mémoire de la base de données) pour fonctionner avec la nouvelle version de EF. Une fois l'Effort de travail qu'il va créer une structure de base de données dans la mémoire pour les "tests unitaires" mais pour l'instant je suis juste en le cognant contre une véritable, sql server vide. Effort: effort.codeplex.com
Oui, il est câblé via Entity Framework 6.0.1.
La seule raison pour laquelle je intenter un procès à une vraie base de données du moment, c'est parce que je ne peux pas obtenir de l'Effort (.NET dans la mémoire de la base de données) pour fonctionner avec la nouvelle version de EF. Une fois l'Effort de travail qu'il va créer une structure de base de données dans la mémoire pour les "tests unitaires" mais pour l'instant je suis juste en le cognant contre une véritable, sql server vide. Effort: effort.codeplex.com
OriginalL'auteur Eric | 2013-12-04
Vous devez vous connecter pour publier un commentaire.
Compte tenu de votre commentaire à propos de la mémoire de base de changement de planifier, voici quelques exemples de comment vous pouvez faire des tests d'écriture de votre scénario:
IHttpActionResult result = people.PutPerson(1000, person).Result;
? Je ne peux pas prendre directement le résultat de la méthode du contrôleur?tu veux dire au sujet de la
.Result
...sans doute, je ne l'ai pas mentionné clair...mais je pense que je faisais l'hypothèse que, si l'action est de retour uneTask<>
, alors vous pouvez le faire.Result
pour obtenir le résultat réel ou si votre framework de test unitaire prend en chargeasync-await
modèle, vous pouvez l'éviter...par exemple, XUnit prend en chargeasync-await
..Si vous retournez un résultat à l'aide de ApiController.BadRequest(ModelState), il ne sera pas jeté à un BadRequestResult. Au lieu de cela, il jetait un InvalidModelStateResult.
OriginalL'auteur Kiran Challa