I have a custom asp.net mvc class validation attribute. My question is how can I unit test it? It would be one thing to test that the class has the attribute but this would not actually test that the logic inside it. This is what I want to test.
我有一个自定义的asp.net mvc类验证属性。我的问题是如何对其进行单元测试?测试该类具有属性是一回事,但这实际上不会测试其中的逻辑。这是我想要测试的。
[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; }
.....removed for brevity }
.....为简洁而删除}
[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;
}
}
I have tried to write a test as follows but this does not work:
我试着按如下方式编写测试,但这不起作用:
[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);
}
The ModelStateDictionary
does not contain the key for this custom attribute. It only contains the attributes for the standard validation attributes.
ModelStateDictionary不包含此自定义属性的键。它仅包含标准验证属性的属性。
Why is this?
为什么是这样?
What is the best way to test these custom attributes?
测试这些自定义属性的最佳方法是什么?
2 个解决方案
#1
38
Your attribute EligabilityStudentDebtsAttribute
is just a standard class, like everything else, just unit test the IsValid()
method. If it works OK, trust to Framework that attribute works OK.
您的属性EligabilityStudentDebtsAttribute只是一个标准类,就像其他所有东西一样,只是对IsValid()方法进行单元测试。如果它工作正常,请信任Framework,该属性可以正常工作。
So:
所以:
[Test]
public void AttibuteTest()
{
// arrange
var value = //.. value to test - new Eligability() ;
var attrib = new EligabilityStudentDebtsAttribute();
// act
var result = attrib.IsValid(value);
// assert
Assert.That(result, Is.True)
}
#2
12
Your custom validation attribute might be dependent on the state of other properties. In this case you can use the System.ComponentModel.DataAnnotations.Validator
static methods, for example:
您的自定义验证属性可能取决于其他属性的状态。在这种情况下,您可以使用System.ComponentModel.DataAnnotations.Validator静态方法,例如:
var model = ...
var context = new ValidationContext(model);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(model, context, results, true);
Assert.True(isValid);
#1
38
Your attribute EligabilityStudentDebtsAttribute
is just a standard class, like everything else, just unit test the IsValid()
method. If it works OK, trust to Framework that attribute works OK.
您的属性EligabilityStudentDebtsAttribute只是一个标准类,就像其他所有东西一样,只是对IsValid()方法进行单元测试。如果它工作正常,请信任Framework,该属性可以正常工作。
So:
所以:
[Test]
public void AttibuteTest()
{
// arrange
var value = //.. value to test - new Eligability() ;
var attrib = new EligabilityStudentDebtsAttribute();
// act
var result = attrib.IsValid(value);
// assert
Assert.That(result, Is.True)
}
#2
12
Your custom validation attribute might be dependent on the state of other properties. In this case you can use the System.ComponentModel.DataAnnotations.Validator
static methods, for example:
您的自定义验证属性可能取决于其他属性的状态。在这种情况下,您可以使用System.ComponentModel.DataAnnotations.Validator静态方法,例如:
var model = ...
var context = new ValidationContext(model);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(model, context, results, true);
Assert.True(isValid);