diff --git a/xUnitStudy.WebApi.Test/UseXUnitAssertTest.cs b/xUnitStudy.WebApi.Test/UseXUnitAssertTest.cs index b384986..34ca880 100644 --- a/xUnitStudy.WebApi.Test/UseXUnitAssertTest.cs +++ b/xUnitStudy.WebApi.Test/UseXUnitAssertTest.cs @@ -8,26 +8,28 @@ using xUnitStudy.Model; namespace xUnitStudy.WebApi.Test { + /// + /// https://xunit.github.io/docs/comparisons + /// [Trait("测试断言分组", "默认组")] public class UseXUnitAssertTest : IDisposable { + #region 准备 public UseXUnitAssertTest() { } + #endregion + + + #region Equal [Fact] public void Equal_String_Test() { Assert.Equal("ping", "ping"); } - [Fact] - public void NotEqual_String_Test() - { - Assert.NotEqual("ping", "ack"); - } - /// /// 断言 string 相等 /// 设置大小写、行尾符、空白符号 比较选项 @@ -74,32 +76,6 @@ namespace xUnitStudy.WebApi.Test Assert.Equal(15d, 15d, precision: 0); } - [Fact] - public void NotEqual_Double_Test() - { - //注意:先舍入,然后再比较 - //舍入规则:四舍五入 - //精度范围[0,15]位小数 - - Assert //1.14d 约等于1.1 而1.15d 约等于1.2 所以不相等 - .NotEqual(1.14d, 1.15d, precision: 1); - - //舍入到2位小数精度,相等 - Assert.NotEqual(2.124d, 2.126d, 2); - - //舍入到3位小数精度,相等 - Assert.NotEqual(3.1234d, 3.1239d, 3); - - //舍入到4位小数精度,不等 - Assert.NotEqual(3.12346d, 3.12341d, 4); - - //舍入到整数,相等 - Assert.NotEqual(16d, 15.111d, precision: 0); - - //没有小数位,舍入到整数 - Assert.NotEqual(16d, 160d, precision: 0); - } - [Fact] public void Equal_Decimal_Test() { @@ -129,32 +105,6 @@ namespace xUnitStudy.WebApi.Test Assert.Equal(15M, 15M, precision: 0); } - [Fact] - public void NotEqual_Decimal_Test() - { - //注意:先舍入,然后再比较 - //舍入规则:四舍五入 - //精度范围[0,15]位小数 - - Assert //1.14M 约等于1.1 而1.15M 约等于1.2 所以不相等 - .NotEqual(1.14M, 1.15M, precision: 1); - - //四舍五入到2位小数精度,不等 - Assert.NotEqual(2.123M, 2.129M, 2); - - //四舍五入到3位小数精度,不等 - Assert.NotEqual(3.1234M, 3.1236M, 3); - - //四舍五入到4位小数精度,不等 - Assert.NotEqual(3.12345M, 3.12349M, 4); - - //四舍五入到整数,不等 - Assert.NotEqual(15M, 15.501M, precision: 0); - - //没有小数位,四舍五入到整数 - Assert.NotEqual(29M, 15M, precision: 0); - } - [Fact] public void Equal_Datetime_Test() { @@ -167,7 +117,7 @@ namespace xUnitStudy.WebApi.Test /// 泛型版基本上都有简化写法 /// [Fact] - public void Equal_GenericT_Test() + public void Equal_Generic_T_Test() { //形如:Assert.Equal(Expected T, Actual T); //常见类型都可以简化,或是有更好的非泛型版,此时,一般用非泛型版 @@ -180,7 +130,7 @@ namespace xUnitStudy.WebApi.Test Assert //简化为 .Equal(3, 3); - Assert.Equal(3, 3); + Assert.Equal(3L, 3L); Assert //简化为 .Equal(3L, 3L); @@ -237,13 +187,13 @@ namespace xUnitStudy.WebApi.Test //对实现IEnumerable接口的对象进行 Equal比较 //形如:Equal(IEnumerable expected, IEnumerable actual); - List expected = new List() {"first","second" }; - List actual = new List() {"first","second" }; + List expected = new List() { "first", "second" }; + List actual = new List() { "first", "second" }; Assert.Equal>(expected, actual); Assert.//简写为 Equal(expected, actual); - } + } /// /// 实现IEnumerable接口对象的 Equal 比较 @@ -278,10 +228,481 @@ namespace xUnitStudy.WebApi.Test expected[0].Id = 100; Assert.NotEqual(expected, actual, comparer); } + #endregion + + #region NotEqual + [Fact] + public void NotEqual_String_Test() + { + Assert.NotEqual("ping", "ack"); + } + + [Fact] + public void NotEqual_Double_Test() + { + //注意:先舍入,然后再比较 + //舍入规则:四舍五入 + //精度范围[0,15]位小数 + + Assert //1.14d 约等于1.1 而1.15d 约等于1.2 所以不相等 + .NotEqual(1.14d, 1.15d, precision: 1); + + //舍入到2位小数精度,相等 + Assert.NotEqual(2.124d, 2.126d, 2); + + //舍入到3位小数精度,相等 + Assert.NotEqual(3.1234d, 3.1239d, 3); + + //舍入到4位小数精度,不等 + Assert.NotEqual(3.12346d, 3.12341d, 4); + + //舍入到整数,相等 + Assert.NotEqual(16d, 15.111d, precision: 0); + + //没有小数位,舍入到整数 + Assert.NotEqual(16d, 160d, precision: 0); + } + + [Fact] + public void NotEqual_Decimal_Test() + { + //注意:先舍入,然后再比较 + //舍入规则:四舍五入 + //精度范围[0,15]位小数 + + Assert //1.14M 约等于1.1 而1.15M 约等于1.2 所以不相等 + .NotEqual(1.14M, 1.15M, precision: 1); + + //四舍五入到2位小数精度,不等 + Assert.NotEqual(2.123M, 2.129M, 2); + + //四舍五入到3位小数精度,不等 + Assert.NotEqual(3.1234M, 3.1236M, 3); + + //四舍五入到4位小数精度,不等 + Assert.NotEqual(3.12345M, 3.12349M, 4); + + //四舍五入到整数,不等 + Assert.NotEqual(15M, 15.501M, precision: 0); + + //没有小数位,四舍五入到整数 + Assert.NotEqual(29M, 15M, precision: 0); + } + + [Fact] + public void NotEqual_Generic_T_Test() + { + //形如:Assert.NotEqual(Expected T, Actual T); + + Assert.NotEqual("ping", "ack"); + Assert //基本使用非泛型版本 + .NotEqual("ping", "ack"); + + Assert.NotEqual(3, 4); + Assert //简化为 + .NotEqual(3, 4); + + Assert.NotEqual(3L, 4L); + Assert //简化为 + .NotEqual(3L, 4L); + + Assert.NotEqual(5.5d, 6.5d); + Assert //简化为 + .NotEqual(5.5d, 6.5d); + + Assert.NotEqual(5.5M, 5.6M); + Assert //简化为 + .NotEqual(5.5M, 6.5M); + + Assert.NotEqual(DateTime.Now.Date, DateTime.Now.Date.AddDays(1)); + Assert //简化为 + .NotEqual(DateTime.Now.Date, DateTime.Now.Date.AddDays(1)); + + //类或其它自定义结构比较,可以使用 + + var obj = new object(); + var obj2 = new object(); + Assert.NotEqual(obj, obj2); + Assert //简化为 + .NotEqual(obj, obj2); + } + + [Fact] + public void NotEqual_Generic_IEqualityComparer_Test() + { + //形如:Assert.NotEqual(Expected T, Actual T,IEqualityComparer comparer); + //实现 IEqualityComparer 接口 + + var expected = new AssertEqualDemo() { Id = 1, Name = "zhansan" }; + var actual = new AssertEqualDemo() { Id = 1, Name = "lishi" }; + + //实现 IEqualityComparer 接口的,可以是被比较对象自己实现接口,也可以是单独的类。 + var comparer = new AssertEqualDemo(); + + Assert.Equal(expected, actual, comparer); + Assert.//可以简写为 + Equal(expected, actual, comparer); + + //id不一样,则不相等 + expected.Id = 3; + Assert.NotEqual(expected, actual, comparer); + } + + [Fact] + public void NotEqual_Generic_IEnumerable_Test() + { + //对实现IEnumerable接口的对象进行 Equal比较 + //形如:NotEqual(IEnumerable expected, IEnumerable actual) + + List expected = new List() { "first", "second","third" }; + List actual = new List() { "first", "second" }; + + Assert.NotEqual>(expected, actual); + Assert.//简写为 + NotEqual(expected, actual); + } + + [Fact] + public void NotEqual_Generic_IEnumerable_IEqualityComparer_Test() + { + //对实现IEnumerable接口的对象进行 Equal比较 + //形如:NotEqual(IEnumerable expected, IEnumerable actual,IEqualityComparer comparer) + //传入实现了 IEqualityComparer 接口的比较参数 + + var expected = new List() + { + new AssertEqualDemo() { Id = 1, Name = "zhansan" }, + new AssertEqualDemo() { Id = 2, Name = "lis" }, + }; + var actual = new List() + { + new AssertEqualDemo() { Id = 1, Name = "wangwu" }, + new AssertEqualDemo() { Id = 2, Name = "zhaoliu" }, + }; + + //实现 IEqualityComparer 接口的,可以是被比较对象自己实现接口,也可以是单独的类。 + var comparer = new AssertEqualDemo(); + + Assert.Equal(expected, actual, comparer); + Assert.//可以简写为 + Equal(expected, actual, comparer); + + //id不一样,则不相等 + expected[0].Id = 100; + Assert.NotEqual(expected, actual, comparer); + } + #endregion + + #region Same + [Fact] + public void Same_String_Test() + { + //验证两个引用类型的对象,是同一个实例 + //注意:必须是引用类型,不能是值类型 + + //特别注明:sting类型,虽然是引用类型,但是比较特殊。采取复制策略,相同值可以(不严谨的说法)认为引用相同 + string expected = "hell,world!"; + string actual = "hell,world!"; + Assert.Same(expected, actual); + + string expected2 = "hell,world!"; + string actual2 = expected2; + Assert.Same(expected2, actual2); + } + + [Fact] + public void Same_Object_Test() + { + object obj1 = new object(); + object obj2 = new object(); + object obj3 = obj1; + object obj4 = obj2; + + Assert.Same(obj1, obj3); + Assert.Same(obj2, obj4); + } + + [Fact] + public void Same_Class_Test() + { + object obj1 = new AssertEqualDemo() { Id = 1, Name = "zhangsan" }; + object obj2 = new AssertEqualDemo() { Id = 1, Name = "zhangsan" }; + object obj3 = obj1; + object obj4 = obj2; + + Assert.Same(obj1, obj3); + Assert.Same(obj2, obj4); + } + #endregion + + #region NotSame + [Fact] + public void NotSame_String_Test() + { + //验证两个引用类型的对象,是同一个实例 + //注意:必须是引用类型,不能是值类型 + + //特别注明:sting类型,虽然是引用类型,但是比较特殊。采取复制策略,相同值可以(不严谨的说法)认为引用相同 + string expected = "hell,world!"; + string actual = "I am chinese!"; + Assert.NotSame(expected, actual); + + Assert.NotSame("abc", "xyz"); + } + + [Fact] + public void NotSame_Object_Test() + { + object obj1 = new object(); + object obj2 = new object(); + Object obj3 = obj2; + + Assert.NotSame(obj1, obj2); + Assert.NotSame(obj1, obj3); + Assert.NotSame(new object(), new object()); + } + + [Fact] + public void NotSame_Class_Test() + { + object obj1 = new AssertEqualDemo() { Id = 1, Name = "zhangsan" }; + object obj2 = new AssertEqualDemo() { Id = 1, Name = "zhangsan" }; + object obj3 = obj1; + object obj4 = obj2; + + Assert.NotSame(obj1, obj2); + Assert.NotSame(obj3, obj4); + Assert.NotSame(obj1, obj4); + Assert.NotSame(obj2, obj3); + } + #endregion + + #region True + [Fact] + public void True_Condition_Test() + { + Assert.True(true); + Assert.True("ping" == "ping"); + Assert.True(2 == 1 + 1); + Assert.True("ping" == "ping" && 2 == 1 + 1); + } + + [Fact] + public void True_Nullable_Test() + { + bool? expected = null; + Assert.True(!expected.HasValue); + + int? expected2 = null; + Assert.True(expected2 == null); + expected2 = 2; + Assert.True(2 == expected2.Value); + } + + [Fact] + public void True_Message_Test() + { + Assert.True(true, "userMessage"); + Assert.True("ping" == "ping", "userMessage"); + Assert.True(2 == 1 + 1, "userMessage"); + + int? nullableInt = null; + Assert.True(null == nullableInt, "userMessage"); + } + #endregion + + #region False + [Fact] + public void False_Condition_Test() + { + Assert.False(false); + Assert.False("ping" == "ack"); + Assert.False(3 == 1+1); + Assert.False("ping" == "ping" && 3 == 1 + 1); + } + + [Fact] + public void False_Nullable_Test() + { + bool? expected = null; + Assert.False(expected.HasValue); + + int? expected2 = 3; + Assert.False(expected2 == null); + Assert.False(4 == expected2.Value); + } + + [Fact] + public void False_Message_Test() + { + Assert.False(false, "userMessage"); + Assert.False("ping" == "ack", "userMessage"); + Assert.False(2 == 1 + 3, "userMessage"); + + int? nullableInt = 3; + Assert.False(null == nullableInt, "userMessage"); + } + #endregion + + #region True|False 可替代断言 + /// + /// 直接设置验证通过 + /// + [Fact] + public void Pass_Test() + { + Assert.True(true, "用True断言替代"); + } + + [Fact] + public void Fail_Test() + { + //Assert.True(false, "用True断言替代"); + } + + /// + /// 大于 + /// + [Fact] + public void GreaterThan_Test() + { + Assert //大于比较,用True(x > y) 替代 + .True(2 > 1); + + int max = 5; + int min = 2; + + Assert.True(max > min); + } + + /// + /// 小于 + /// + [Fact] + public void LessThan_Test() + { + Assert //小于比较,用True(x < y) 替代 + .True(2 < 3); + + int max = 5; + int min = 2; + + Assert.True(min < max); + } + + [Fact] + public void NaN_Test() + { + //NaN=Not a Number,是否不为数字 + + //说明:在浮点数计算中,0除以0将得到NaN,正数除以0将得到PositiveInfinity,负数除以0将得到NegativeInfinity。 + //浮点数运算从不引发异常 + + Assert.True(double.IsNaN(0 / 0d)); + + Assert.True(double.IsPositiveInfinity(1 / 0d)); + + Assert.True(double.IsNegativeInfinity(-1 / 0d)); + + } + #endregion + + [Fact] + public void Empty_Test() + { + List expected = new List(); + + Assert //针对于集合,为Empty,即是集合中元素的个数为0。但集合为空引用null值时将引发异常 + .Empty(expected); + } + + [Fact] + public void NotEmpty_Test() + { + List expected = new List() { "first", "second" }; + + Assert //针对于集合,不为Empty,即是集合中元素的个数大于0。集合为空引用null值时将引发异常 + .NotEmpty(expected); + } + + [Fact] + public void Null_Test() + { + Assert //null值,空引用 + .Null(null); + + string exp = null; + Assert.Null(exp); + + List list = null; + Assert.Null(list); + } + + [Fact] + public void NotNull_Test() + { + Assert //null值,空引用 + .NotNull(new object()); + + Assert.NotNull(""); + Assert.NotNull(string.Empty); + + Assert.NotNull(new List()); + + Assert.NotNull(new List() { "first", "second" }); + } + + [Fact] + public void IsType_Test() + { + //此形式,只在泛型不能使用时,才使用;应优先使用泛型版。 + Assert.IsType(typeof(string), "aaaa"); + + //泛型版 + Assert.IsType("hell,world!"); + Assert.IsType(2); + Assert.IsType(2L); + Assert.IsType(2d); + Assert.IsType(2M); + Assert.IsType(DateTime.Now); + Assert.IsType(new AssertEqualDemo()); + } + + [Fact] + public void IsNotType_Test() + { + //此形式,只在泛型不能使用时,才使用;应优先使用泛型版。 + Assert.IsNotType(typeof(string), 22); + + //泛型版 + Assert.IsNotType(2); + Assert.IsNotType("hello"); + Assert.IsNotType("521"); + Assert.IsNotType(new object()); + Assert.IsNotType("55555"); + Assert.IsNotType("2018-08-03"); + Assert.IsNotType(new object()); + } + + [Fact] + public void IsAssignableFrom_Test() + { + //可以从指定的类型派生 + Assert.IsAssignableFrom(22); + } + + [Fact] + public void All_Test() + { + List items = new List() { "abc","ac","ad","adddeddd"}; + Assert.All(items, f => f.StartsWith("a")); + } + #region 清理 public void Dispose() { } + #endregion } }