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 |
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 |
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 |
Assert.All() | 验证第一个参数集合中的所有项都可以传入第二个Action |
Assert.PropertyChanged() | 验证执行第三个参数Action |
Assert.Throws()/Assert.Throws |
验证测试代码抛出指定异常(不能是指定异常的子类)如果测试代码返回Task,应该使用异步方法 |
Assert.ThrowsAny |
验证测试代码抛出指定异常或指定异常的子类 如果测试代码返回Task,应该使用异步方法 |