首页 > 解决方案 > 尝试使用 MSTest 为 C# 中的 DataType.PhoneNumber 编写单元测试

问题描述

我是 MSTest 的新手。我有一个数据类型 PhoneNumber:

public class PhoneNumber : ValueObject
{
    [DataType(DataType.PhoneNumber)]
    public string PhNumber { get; private set; }
}

现在我需要为它编写一个单元测试。几个问题:

  1. MS Test 是否有任何内置功能来验证数据类型?
  2. 是否有关于如何验证电话号码的示例代码?

标签: c#mstestphone-number

解决方案


请改用该[Phone]属性。

PhoneAttribute派生自DataTypeAttribute并覆盖该IsValid方法,该方法检查该值是否实际上是有效的电话号码。

使用

[DataType(DataType.PhoneNumber)]

对电话号码验证没有任何作用,并且在上面显示的示例中使用不正确

DataTypeAttribute主要用作创建自定义和目标验证属性的基本属性。

出于演示目的,假设我要测试以下课程

public class PhoneNumber : ValueObject {
    public PhoneNumber(string number) {
        Number = phoneNumber;
    }

    [Phone]
    public string Number { get; private set; }

    //...
}

查看以下 MSTest 测试,了解有效和无效的电话号码

[TestClass]
public class PhoneNumberTests {
    [DataTestMethod]
    [DataRow("555-5555")]
    [DataRow("555-555-5555")]
    [DataRow("1-555-555-5555")]
    public void Should_Be_Valid(string number) {
        //Arrange
        var subject = new PhoneNumber(number);
        var context = new ValidationContext(subject, null, null);
        var results = new List<ValidationResult>();

        //Act
        var actual = Validator.TryValidateObject(subject, context, results, true);

        //Assert
        actual.Should().BeTrue();
        results.Should().BeEmpty();
    }

    [DataTestMethod]
    [DataRow("abcd")]
    [DataRow("5555a")]
    [DataRow("abc5555a")]
    public void Should_Not_Be_Valid(string number) {
        //Arrange
        var subject = new PhoneNumber(number);
        var context = new ValidationContext(subject, null, null);
        var results = new List<ValidationResult>();

        //Act
        var actual = Validator.TryValidateObject(subject, context, results, true);

        //Assert
        actual.Should().BeFalse();
        results.Should().NotBeEmpty();
    }
}

请注意使用静态Validator类来评估修饰属性并验证对象是否有效。


推荐阅读