gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:24:03 24 4
gpt4 key购买 nike

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

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;
}
}

我不知道这个类(class)的单元测试如何正确。

谢谢。

最佳答案

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

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;
}
}

事先注意:我的一些单元测试命名约定可能与您使用的命名约定不同(那里有一些)。

现在我们将创建一个单元测试。我了解到您已经有一个测试项目,如果您没有,请创建一个。在此测试项目中,您将创建一个新的单元测试(基本单元测试),我们将其命名为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# - 如何为自定义数据注释进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10450914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com