编程语言
首页 > 编程语言> > c# – 如何对自定义数据注释进行单元测试

c# – 如何对自定义数据注释进行单元测试

作者:互联网

我有以下简单的类数据注释来控制电话号码的区域:

public class PhoneAreaAttribute : ValidationAttribute, IClientValidatable
{
    public const string ValidInitNumber = "0";
    public const int MinLen = 2;
    public const int MaxLen = 4;

    public override bool IsValid(object value)
    {
        var area = (string)value;
        if (string.IsNullOrWhiteSpace(area))
        {
            return true;
        }

        if (area.StartsWith(PhoneAreaAttribute.ValidInitNumber))
        {
            return false;
        }

        if (!Regex.IsMatch(area, @"^[\d]+$"))
        {
            return false;
        }

        if (!area.LengthBetween(PhoneAreaAttribute.MinLen, PhoneAreaAttribute.MaxLen))
        {
            return false;
        }

        return true;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
            ValidationType = "phoneArea",
        };

        yield return rule;
    }
}

我不知道这个班级的单元测试怎么样.

谢谢.

解决方法:

好的,基本上测试属性与测试任何常规类相同.我拿了你的课并减少了一点,所以我可以运行它(你创建了一些扩展方法,我不想重新创建).您可以在下面找到此类定义.

public class PhoneAreaAttribute : ValidationAttribute
{
    public const string ValidInitNumber = "0";

    public override bool IsValid(object value)
    {
        var area = (string)value;

        if (string.IsNullOrEmpty(area))
        {
            return true;
        }

        if (area.StartsWith(PhoneAreaAttribute.ValidInitNumber))
        {
            return false;
        }

        return true;
    }
}

事先注意:我的一些单元测试命名约定可能与你使用的命名约定不同(有几个).

现在我们将创建一个单元测试.我知道你已经有了一个测试项目,如果你没有,只需创建一个.在这个测试项目中,您将创建一个新的单元测试(Basic Unit Test),我们将其命名为PhoneAreaAttributeTest.

作为一种好的做法,我创建了一个测试初始化​​程序来创建所有共享的“资源”,在本例中是PhoneAreaAttribute类的新实例.是的,您可以创建一个实例,就像您习惯使用“常规”类一样(事实上,“常规”类与属性类之间没有太大区别).

现在我们准备开始编写方法的测试.基本上你会想要处理所有可能的场景.我将在这里向您展示我的(简化)IsValid方法中可能出现的两种情况.首先,我将看看给定的对象参数是否可以被赋予一个字符串(这是第一个场景/ TestMethod).其次,我将看看是否正确处理了“IsNullOrEmpty”的路径(这是第二种情况/ TestMethod).

如您所见,它只是一个常规的单元测试.这些只是非常基础.如果您仍有疑问,我还建议您阅读一些教程.

这是PhoneAreaAttributeTest测试类:

[TestClass]
public class PhoneAreaAttributeTest
{
    public PhoneAreaAttribute PhoneAreaAttribute { get; set; }

    [TestInitialize]
    public void PhoneAreaAttributeTest_TestInitialise()
    {
        PhoneAreaAttribute = new PhoneAreaAttribute();
    }


    [TestMethod]
    [ExpectedException(typeof(InvalidCastException))]
    public void PhoneAreaAttributeTest_IsValid_ThrowsInvalidCastException()
    {
        object objectToTest = new object();
        PhoneAreaAttribute.IsValid(objectToTest);
    }


    [TestMethod]
    public void PhoneAreaAttributeTest_IsValid_NullOrEmpty_True()
    {
        string nullToTest = null;
        string emptoToTest = string.Empty;

        var nullTestResult = PhoneAreaAttribute.IsValid(nullToTest);
        var emptyTestResult = PhoneAreaAttribute.IsValid(emptoToTest);

        Assert.IsTrue(nullTestResult, "Null Test should return true.");
        Assert.IsTrue(emptyTestResult, "Empty Test should return true.");
    }
}

标签:c,unit-testing,data-annotations
来源: https://codeday.me/bug/20190626/1290654.html