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