Modèle de validation de l'état dans les tests unitaires
Je suis en train d'écrire un test unitaire pour un contrôleur comme ceci:
public HttpResponseMessage PostLogin(LoginModel model)
{
if (!ModelState.IsValid)
return new HttpResponseMessage(HttpStatusCode.BadRequest);
}
le modèle ressemble:
public class LoginModel
{
[Required]
public string Username { set; get; }
[Required]
public string Password { set; get; }
}
Puis j'ai unité de test comme celui-ci:
[TestMethod]
public void TestLogin_InvalidModel()
{
AccountController controller = CreateAccountController();
...
var response = controller.PostLogin(new LoginModel() { });
Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
}
Fait le ModelState est validé... ce qui est étrange pour moi que les deux champs sont obligatoires...
Quelqu'un pourrait-il conseiller?
- Pour aspnetcore voir stackoverflow.com/questions/43229338/...
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle le modèle de l'état est valable, c'est que d'un nouveau modèle d'état est créé lorsque vous avez de nouveaux en place d'un contrôleur. L'API Web ne fait pas la liaison de paramètre pour vous ici, afin de ne pas même avoir une chance d'ajouter le modèle de l'état erreurs.
Si vous voulez garder cela comme un test de l'unité, alors vous devriez ajouter le modèle de l'état erreurs vous-même et de tester ce qui se passe.
Si vous voulez tester que le modèle de l'état serait invalide une réelle demande, je vous recommande la lecture de ce billet de blog:
http://blogs.msdn.com/b/youssefm/archive/2013/01/28/writing-tests-for-an-asp-net-webapi-service.aspx
et essayer de tester contre une dans la mémoire du serveur. Une petite note pour votre cas, serait que vous souhaitez peut-être utiliser un StringContent au lieu d'une ObjectContent sur la demande pour s'assurer que l'API Web tente de désérialiser et de lier le corps correctement.
TL;DR
Si vous ne voulez pas lire l'intégralité de l'article de Youssef et veulent une solution rapide à la façon de faire ModelState.IsValid retourne la valeur false. Ce faire.
Maintenant, je peux imaginer la CreateAccountController() ressemble à quelque chose comme ceci pour minimum ->
Espère une réponse rapide pour ceux googler 🙂
Comme mentionné avant, vous avez besoin de tests d'intégration pour valider la ModelState. Donc, avec Asp.Net de Base, je vais creuser cette question à ajouter une solution simple pour intégrer des tests avec Asp.Net de Base et la validation de ModelState
Ajouter le package
Microsoft.AspNetCore.TestHost
et vous pouvez soumettre une demande simple:Vous pouvez trouver plus à ce sujet ici:
http://asp.net-hacker.rocks/2017/09/27/testing-aspnetcore.html
Espère que cela aide.
J'ai utilisé les méthodes suivantes pour valider le modèle de l'état dans l'unité de test de Visual studio 2017, C#, NET 4.x.x
L'exemple est pour une demande en format JSON. Remplacer YourController pour le nom de votre contrôleur, et YourRequesType, pour le type d'objet de votre demande.
Cela vous donne la possibilité de tester votre modèle pour la validation sans aller au service.