Skip to content

Assert 断言

XUnit下面有带了一个Assert类,可以让我们可以用来判断结果是不是符合预期。

判断有没有相等

比如我们要测试一个取年纪的方法。如下。

csharp
public class MyTestClass
{
    [Fact]
    public void MyTest()
    {
        var resut = GetAge(new DateTime(2010, 1, 1));

        Assert.Equal(11, resut);
    }

    public int GetAge(DateTime d)
    {
        return DateTime.Now.Year - d.Year;
    }
}

上面的这种单元测试,或者说GetAge写法是有问题的。你有看出来了吗?

判断有没有抛出异常

使用Assert.Throws 判断有没有抛出异常

csharp
    public class MyTestClass
    {
        [Fact]
        public void MyTest()
        {
            var ex = Assert.Throws<ArgumentException>(() =>
            {
                Add(null, 3);
            });
            Assert.Equal("a", ex.Message);
        }

        public int Add(int? a, int b)
        {
            throw new ArgumentException(nameof(a));
        }
    }

判断类型

使用 Assert.IsType判断类型

csharp
    public class MyTestClass
    {
        [Fact]
        public void MyTest()
        {
            var result = Add(5, 3);

            var i = Assert.IsType<int>(result);
            Assert.Equal(8, i);
        }

        public object Add(int a, int b)
        {
            return a + b;
        }
    }

判断是不是空集合

csharp
    public class MyTestClass
    {
        [Fact]
        public void MyTest()
        {
            Assert.Empty(GetList());
        }

        public List<int> GetList()
        {
            return new List<int>();
        }
    }

判断是不是子集

Subset 判断是不是子集 ProperSubset 判断是不是真子集, 跟上面的差别是 集合内容不能一样。

csharp
    public class MyTestClass
    {
        [Fact]
        public void GetList_Should_Return_Correctly()
        {
            var set = new HashSet<int> { 1, 4, 5 };

            var result = GetList();

            Assert.Subset<int>(set, result);
            Assert.ProperSubset<int>(set, GetList());
        }

        public HashSet<int> GetList()
        {
            return new HashSet<int>() { 1, 5, 4 };
        }
    }

判断集合元素

csharp
 public class MyTestClass
    {
        [Fact]
        public void MyTest()
        {
            var result = GetList();

            Assert.Collection<int>(result, x => Assert.Equal(1, x),
                x => Assert.Equal(4, x),
                x => Assert.Equal(5, x));
        }

        public List<int> GetList()
        {
            return new List<int>() { 1, 4, 5 };
        }
    }

上面的这种方式看起来不是很方便,后面会介绍 使用FluentAssertions类判断。会更方便一些。

方法说明

方法说明
Assert.Equal()验证两个参数是否相等,支持字符串等常见类型。同时有泛型方法可用,当比较泛型类型对象时使用默认的IEqualityComparer<T>实现,也有重载支持传入IEqualityComparer<T>
Assert.NotEqual()与上面的相反
Assert.Same()验证两个对象是否同一实例,即判断引用类型对象是否同一引用
Assert.NotSame()与上面的相反
Assert.Contains()验证一个对象是否包含在序列中,验证一个字符串为另一个字符串的一部分
Assert.DoesNotContain()与上面的相反
Assert.Matches()验证字符串匹配给定的正则表达式
Assert.DoesNotMatch()与上面的相反
Assert.StartsWith()验证字符串以指定字符串开头。可以传入参数指定字符串比较方式
Assert.EndsWith()验证字符串以指定字符串结尾
Assert.Empty()验证集合为空
Assert.NotEmpty()与上面的相反
Assert.Single()验证集合只有一个元素
Assert.InRange()验证值在一个范围之内,泛型方法,泛型类型需要实现IComparable<T>,或传入IComparer<T>
Assert.NotInRange()与上面的相反
Assert.Null()验证对象为空
Assert.NotNull()与上面的相反
Assert.StrictEqual()判断两个对象严格相等,使用默认的IEqualityComparer<T>对象
Assert.NotStrictEqual()与上面相反
Assert.IsType()/Assert.IsType<T>()验证对象是某个类型(不能是继承关系)
Assert.IsNotType()/Assert.IsNotType<T>()与上面的相反
Assert.IsAssignableFrom()/Assert.IsAssignableFrom<T>()验证某个对象是指定类型或指定类型的子类
Assert.Subset()验证一个集合是另一个集合的子集
Assert.ProperSubset()验证一个集合是另一个集合的真子集 (集合元素不能完全一样)
Assert.ProperSuperset()验证一个集合是另一个集合的真超集
Assert.Collection()验证第一个参数集合中所有项都可以在第二个参数传入的Action<T>序列中相应位置的Action<T>上执行而不抛出异常。
Assert.All()验证第一个参数集合中的所有项都可以传入第二个Action<T>类型的参数而不抛出异常。与Collection()类似,区别在于这里Action<T>只有一个而不是序列。
Assert.PropertyChanged()验证执行第三个参数Action<T>使被测试INotifyPropertyChanged对象触发了PropertyChanged时间,且属性名为第二个参数传入的名称。
Assert.Throws()/Assert.Throws<T>() Assert.ThrowsAsync()/Assert.ThrowsAsync<T>()验证测试代码抛出指定异常(不能是指定异常的子类)如果测试代码返回Task,应该使用异步方法
Assert.ThrowsAny<T>() Assert.ThrowsAnyAsync<T>()验证测试代码抛出指定异常或指定异常的子类 如果测试代码返回Task,应该使用异步方法

简单就是美