Comment puis-je l'unité de test de mon custom de validation de l'attribut
J'ai un custom asp.net mvc classe de validation de l'attribut.
Ma question est comment puis-je l'unité de la tester?
Ce serait une chose à tester que la classe a l'attribut, mais ce ne serait pas fait de test que la logique à l'intérieur. C'est ce que je veux tester.
[Serializable]
[EligabilityStudentDebtsAttribute(ErrorMessage = "You must answer yes or no to all questions")]
public class Eligability
{
[BooleanRequiredToBeTrue(ErrorMessage = "You must agree to the statements listed")]
public bool StatementAgree { get; set; }
[Required(ErrorMessage = "Please choose an option")]
public bool? Income { get; set; }
.....supprimé pour des raisons de concision
}
[AttributeUsage(AttributeTargets.Class)]
public class EligabilityStudentDebtsAttribute : ValidationAttribute
{
//If AnyDebts is true then
//StudentDebts must be true or false
public override bool IsValid(object value)
{
Eligability elig = (Eligability)value;
bool ok = true;
if (elig.AnyDebts == true)
{
if (elig.StudentDebts == null)
{
ok = false;
}
}
return ok;
}
}
J'ai essayé d'écrire un essai, comme suit, mais cela ne fonctionne pas:
[TestMethod]
public void Eligability_model_StudentDebts_is_required_if_AnyDebts_is_true()
{
//Arrange
var eligability = new Eligability();
var controller = new ApplicationController();
//Act
controller.ModelState.Clear();
controller.ValidateModel(eligability);
var actionResult = controller.Section2(eligability,null,string.Empty);
//Assert
Assert.IsInstanceOfType(actionResult, typeof(ViewResult));
Assert.AreEqual(string.Empty, ((ViewResult)actionResult).ViewName);
Assert.AreEqual(eligability, ((ViewResult)actionResult).ViewData.Model);
Assert.IsFalse(((ViewResult)actionResult).ViewData.ModelState.IsValid);
}
La ModelStateDictionary
ne contient pas la clé pour cet attribut personnalisé.
Il contient uniquement les attributs de la norme attributs de validation.
Pourquoi est-ce?
Quelle est la meilleure façon de tester ces attributs personnalisés?
Vous devez vous connecter pour publier un commentaire.
Votre attribut
EligabilityStudentDebtsAttribute
est juste une classe standard, comme tout le reste, juste de l'unité de test de laIsValid()
méthode. Si cela fonctionne bien, fiducie Cadre de cet attribut fonctionne OK.Donc:
System.ComponentModel.DataAnnotations
dans votre unité d'assemblage de test ou autre chose que vous ne voyez pas leIsValid
méthode (elle aussi ne compile pas mais il m'a fallu un certain temps pour repérer ce)Personnalisé de votre validation de l'attribut peut être dépendante de l'état d'autres propriétés. Dans ce cas, vous pouvez utiliser le
System.ComponentModel.DataAnnotations.Validator
méthodes statiques, par exemple:J'ai découvert que
IsValid
ne fonctionne pas bien sur les types simples comme les string. E. g. si vous avez une validation sur une chaîne de requête de paramètre qui n'est pas un objet. En outre, il est plus facile de tester directement une valeur à l'attribut, sans avoir à fournir un ensemble d'objets. Il permet également de vérifier le message d'erreur. Voilà comment cela fonctionne:Ce code uniquement aux tests de la validation de votre valeur d'entrée et rien d'autre.
P. S. j'ai testé ce dotnet de base, mais je pense que cela fonctionne pour le commun des dotnet ainsi.