How can I unit test my custom validation attribute

Posted by MightyAtom on Stack Overflow See other posts from Stack Overflow or by MightyAtom
Published on 2011-01-12T08:33:22Z Indexed on 2011/01/12 8:54 UTC
Read the original article Hit count: 223

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.

[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. Why is this? What is the best way to test these custom attributes? Thanks

© Stack Overflow or respective owner

Related posts about unit-testing

Related posts about asp.net-mvc-2