Assert 断言

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

判断有没有相等

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

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 判断有没有抛出异常

    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判断类型

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

判断是不是空集合

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

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

判断是不是子集

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

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

判断集合元素

 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实现,也有重载支持传入IEqualityComparer
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,或传入IComparer
Assert.NotInRange() 与上面的相反
Assert.Null() 验证对象为空
Assert.NotNull() 与上面的相反
Assert.StrictEqual() 判断两个对象严格相等,使用默认的IEqualityComparer对象
Assert.NotStrictEqual() 与上面相反
Assert.IsType()/Assert.IsType() 验证对象是某个类型(不能是继承关系)
Assert.IsNotType()/Assert.IsNotType() 与上面的相反
Assert.IsAssignableFrom()/Assert.IsAssignableFrom() 验证某个对象是指定类型或指定类型的子类
Assert.Subset() 验证一个集合是另一个集合的子集
Assert.ProperSubset() 验证一个集合是另一个集合的真子集 (集合元素不能完全一样)
Assert.ProperSuperset() 验证一个集合是另一个集合的真超集
Assert.Collection() 验证第一个参数集合中所有项都可以在第二个参数传入的Action序列中相应位置的Action上执行而不抛出异常。
Assert.All() 验证第一个参数集合中的所有项都可以传入第二个Action类型的参数而不抛出异常。与Collection()类似,区别在于这里Action只有一个而不是序列。
Assert.PropertyChanged() 验证执行第三个参数Action使被测试INotifyPropertyChanged对象触发了PropertyChanged时间,且属性名为第二个参数传入的名称。
Assert.Throws()/Assert.Throws() Assert.ThrowsAsync()/Assert.ThrowsAsync() 验证测试代码抛出指定异常(不能是指定异常的子类)如果测试代码返回Task,应该使用异步方法
Assert.ThrowsAny() Assert.ThrowsAnyAsync() 验证测试代码抛出指定异常或指定异常的子类 如果测试代码返回Task,应该使用异步方法
最近更新的
...