diff --git a/xUnitStudy.Model/xUnitStudy.Model.csproj b/xUnitStudy.Model/xUnitStudy.Model.csproj
index 6fdccdd..0ec04d7 100644
--- a/xUnitStudy.Model/xUnitStudy.Model.csproj
+++ b/xUnitStudy.Model/xUnitStudy.Model.csproj
@@ -45,6 +45,12 @@
+
+
+
+
+
+
diff --git a/xUnitStudy.Model/xUnitStudy/AssertEqualDemo.cs b/xUnitStudy.Model/xUnitStudy/AssertEqualDemo.cs
new file mode 100644
index 0000000..bce71cf
--- /dev/null
+++ b/xUnitStudy.Model/xUnitStudy/AssertEqualDemo.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace xUnitStudy.Model
+{
+ public class AssertEqualDemo : IEqualityComparer
+ {
+ public int Id { get; set; }
+
+ public string Name { get; set; }
+
+ public bool Equals(AssertEqualDemo x, AssertEqualDemo y)
+ {
+ return x.Id == y.Id;
+ }
+
+ public int GetHashCode(AssertEqualDemo obj)
+ {
+ return Id;
+ }
+ }
+}
diff --git a/xUnitStudy.Model/xUnitStudy/ClassFixtureDemo.cs b/xUnitStudy.Model/xUnitStudy/ClassFixtureDemo.cs
new file mode 100644
index 0000000..3c3b045
--- /dev/null
+++ b/xUnitStudy.Model/xUnitStudy/ClassFixtureDemo.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace xUnitStudy.Model
+{
+ ///
+ /// 测试方法共享对象实例
+ ///
+ public class ClassFixtureDemo : IDisposable
+ {
+ public int CallTimes { get; private set; }
+ public List Persons;
+ public ClassFixtureDemo()
+ {
+ Persons = new List()
+ {
+ new Person(){ Id=1, FirstName="first1",LastName="last1" },
+ new Person(){ Id=2, FirstName="first2",LastName="last2" },
+ new Person(){ Id=3, FirstName="first3",LastName="last3" },
+ };
+ }
+
+ public (bool result, Person person) AddPerson(Person person)
+ {
+ CallTimes += 1;
+
+ var exist = Persons.FirstOrDefault(p => p.Id == person.Id);
+ if (exist == null)
+ {
+ Persons.Add(person);
+ return ValueTuple.Create(true, person);
+ }
+ else
+ {
+ return ValueTuple.Create(false, person);
+ }
+ }
+
+ public (bool result, Person person) RemovePerson(Person person)
+ {
+ CallTimes += 1;
+
+ var exist = Persons.FirstOrDefault(p => p.Id == person.Id);
+ if (exist == null)
+ {
+ return ValueTuple.Create(false, person);
+ }
+ else
+ {
+ Persons.Remove(exist);
+ return ValueTuple.Create(true, exist);
+ }
+ }
+
+ public void Dispose()
+ {
+ Persons = null;
+ }
+ }
+}
diff --git a/xUnitStudy.Model/xUnitStudy/CollectionFixtureDemo.cs b/xUnitStudy.Model/xUnitStudy/CollectionFixtureDemo.cs
new file mode 100644
index 0000000..7294f29
--- /dev/null
+++ b/xUnitStudy.Model/xUnitStudy/CollectionFixtureDemo.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace xUnitStudy.Model
+{
+ ///
+ /// 测试方法共享对象实例
+ ///
+ public class CollectionFixtureDemo : IDisposable
+ {
+ public List Persons;
+
+ public CollectionFixtureDemo()
+ {
+ Persons = new List()
+ {
+ new Person(){ Id=1, FirstName="first1",LastName="last1" },
+ new Person(){ Id=2, FirstName="first2",LastName="last2" },
+ new Person(){ Id=3, FirstName="first3",LastName="last3" },
+ };
+ }
+
+ public Person GetPersonById(int personId)
+ {
+ var find = Persons.FirstOrDefault(p => p.Id == personId);
+
+ return find;
+ }
+
+ public void Dispose()
+ {
+ Persons = null;
+ }
+ }
+}
diff --git a/xUnitStudy.Model/xUnitStudy/IPerson.cs b/xUnitStudy.Model/xUnitStudy/IPerson.cs
new file mode 100644
index 0000000..8b7e9ef
--- /dev/null
+++ b/xUnitStudy.Model/xUnitStudy/IPerson.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace xUnitStudy.Model
+{
+ public interface IPerson
+ {
+ int Id { get; set; }
+
+ string FirstName { get; set; }
+
+ string LastName { get; set; }
+
+ string GetFullName();
+ }
+}
diff --git a/xUnitStudy.Model/xUnitStudy/Person.cs b/xUnitStudy.Model/xUnitStudy/Person.cs
new file mode 100644
index 0000000..bac478e
--- /dev/null
+++ b/xUnitStudy.Model/xUnitStudy/Person.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace xUnitStudy.Model
+{
+ public class Person:IPerson,IEqualityComparer,IComparer
+ {
+ public int Id { get; set; }
+
+ public string FirstName { get; set; }
+
+ public string LastName { get; set; }
+
+ public string GetFullName()
+ {
+ return FirstName + "_" + LastName;
+ }
+ public bool Equals(Person x, Person y)
+ {
+ return x.Id == y.Id;
+ }
+
+ public int GetHashCode(Person obj)
+ {
+ return obj.Id;
+ }
+
+ ///
+ /// IComparer接口实现
+ ///
+ /// 比较对象1
+ /// 比较对象2
+ /// x小于y则返回负整数;x大于y则返回正整数;x等于y则返回0
+ public int Compare(Person x, Person y)
+ {
+ if (x.Id < y.Id)
+ {
+ return -1;
+ }
+ else if (x.Id == y.Id)
+ {
+ return 0;
+ }
+ else
+ {
+ return 1;
+ }
+ }
+ }
+}
diff --git a/xUnitStudy.Model/xUnitStudy/Teacher.cs b/xUnitStudy.Model/xUnitStudy/Teacher.cs
new file mode 100644
index 0000000..dde6c6f
--- /dev/null
+++ b/xUnitStudy.Model/xUnitStudy/Teacher.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace xUnitStudy.Model
+{
+ public class Teacher:Person
+ {
+ public int Grade { get; set; }
+ }
+}
diff --git a/xUnitStudy.WebApi.Test/ApiControllerTest.cs b/xUnitStudy.WebApi.Test/ApiControllerTest.cs
new file mode 100644
index 0000000..aea90f7
--- /dev/null
+++ b/xUnitStudy.WebApi.Test/ApiControllerTest.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xunit;
+using Xunit.Abstractions;
+
+using xUnitStudy.Model;
+using xUnitStudy.WebApi;
+using xUnitStudy.WebApi.Controllers;
+
+namespace xUnitStudy.WebApi.Test
+{
+ public class ApiControllerTest
+ {
+ [Fact]
+ public void Test()
+ {
+ var id = 5;
+ var valueController = new ValuesController();
+
+ var result = valueController.Get(id);
+
+ Assert.Equal(id.ToString(), result);
+ }
+ }
+}
diff --git a/xUnitStudy.WebApi.Test/AutoFac/AutofacStudy.cs b/xUnitStudy.WebApi.Test/AutoFac/AutofacStudy.cs
new file mode 100644
index 0000000..6b2601e
--- /dev/null
+++ b/xUnitStudy.WebApi.Test/AutoFac/AutofacStudy.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Autofac;
+using Autofac.Builder;
+using Autofac.Core;
+using Autofac.Extras;
+using Autofac.Features;
+using Autofac.Util;
+
+namespace xUnitStudy.WebApi.Test.AutoFac
+{
+ public class AutofacStudy
+ {
+
+ }
+}
diff --git a/xUnitStudy.WebApi.Test/Properties/AssemblyInfo.cs b/xUnitStudy.WebApi.Test/Properties/AssemblyInfo.cs
index a333ee7..a344d57 100644
--- a/xUnitStudy.WebApi.Test/Properties/AssemblyInfo.cs
+++ b/xUnitStudy.WebApi.Test/Properties/AssemblyInfo.cs
@@ -1,6 +1,7 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
+using Xunit;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
@@ -34,3 +35,6 @@ using System.Runtime.InteropServices;
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
+
+//xUnit 分组设置
+[assembly:AssemblyTrait("程序集分组","包括程序集内测试方法")]
diff --git a/xUnitStudy.WebApi.Test/StudentBll/StudentBllTest.cs b/xUnitStudy.WebApi.Test/StudentBll/StudentBllTest.cs
index d4ac5f6..1fb68b8 100644
--- a/xUnitStudy.WebApi.Test/StudentBll/StudentBllTest.cs
+++ b/xUnitStudy.WebApi.Test/StudentBll/StudentBllTest.cs
@@ -17,15 +17,97 @@ namespace xUnitStudy.WebApi.Test
{
public class StudentBllTest:IDisposable
{
- private StudentBll bll;
+ #region 准备
+ private StudentBll actualBll;
public StudentBllTest()
{
- bll = new Bll.StudentBll();
+ //这里创建和设置需要注入的IDal。当然也可以创建和设置,直接注入。
+ actualBll = new Bll.StudentBll();
}
+ #endregion
[Fact]
- public void GetTuitionTest()
+ public void Students_Test()
{
+ IStudentBll actual_Bll = new StudentBll();
+ List studentsFromProperty = actual_Bll.Students;
+ List studentsFromMethod = actual_Bll.GetAll();
+
+ Assert.Equal(studentsFromMethod, studentsFromProperty);
+ }
+
+ [Fact]
+ public void GetAll_Test()
+ {
+ List students = actualBll.GetAll();
+
+ Assert.Equal(actualBll.Students, students);
+ }
+
+ [Fact]
+ public void GetStudentById_Test()
+ {
+ var studentId = 1;
+
+ Student student = actualBll.GetStudentById(studentId);
+
+ Assert.NotNull(student);
+ Assert.Equal(studentId, student.Id);
+ }
+
+ [Fact]
+ public void AddStudent_Test()
+ {
+ var exitsStudent = new Student() { Id=1,Name="lishi",Age=40,lever=0};
+ var newStudent = new Student() { Id=100,Name="wangwu",Age=30,lever=0};
+
+ var exitsResult = actualBll.AddStudent(exitsStudent);
+ var newResult = actualBll.AddStudent(newStudent);
+
+ Assert.False(exitsResult.result);
+
+ Assert.True(newResult.result);
+ Assert.Contains(newStudent, actualBll.GetAll());
+ }
+
+ [Fact]
+ public void UpdateStudent_Test()
+ {
+ var exitsStudent = new Student() { Id = 1, Name = "lishi", Age = 40, lever = 0 };
+ var newStudent = new Student() { Id = 100, Name = "wangwu", Age = 30, lever = 0 };
+
+ var exitsResult = actualBll.UpdateStudent(exitsStudent);
+ var newResult = actualBll.UpdateStudent(newStudent);
+
+ Assert.True(exitsResult.result);
+ Assert.Contains(exitsStudent, actualBll.GetAll());
+
+ Assert.False(newResult.result);
+ }
+
+ [Fact]
+ public void DeleteStudent_Test()
+ {
+ var exitsStudent = new Student() { Id = 1, Name = "lishi", Age = 40, lever = 0 };
+ var newStudent = new Student() { Id = 100, Name = "wangwu", Age = 30, lever = 0 };
+
+ var exitsResult = actualBll.DeleteStudent(exitsStudent.Id);
+ var newResult = actualBll.DeleteStudent(newStudent.Id);
+
+ Assert.True(exitsResult);
+ Assert.DoesNotContain(exitsStudent, actualBll.GetAll());
+
+ Assert.False(newResult);
+ }
+
+ ///
+ /// 获取学费
+ /// 属性注入:IDal Mock对象
+ ///
+ [Fact]
+ public void GetTuition_UseMoq_Test()
+ {
+ // #准备
Mock mockStudentDal = new Mock();
mockStudentDal
.Setup(m => m.GetStudentById(2))
@@ -33,18 +115,23 @@ namespace xUnitStudy.WebApi.Test
(
new Student() { Id = 2, Name = "小小张", Age = 95 }
);
- //属性注入
- bll.dal = mockStudentDal.Object;
- var student = bll.GetStudentById(2);
- var tuition = bll.GetTuition(2);
+ //属性注入,也可以使用构造函数注入
+ actualBll.dal = mockStudentDal.Object;
+
+ // #使用
+ var student = actualBll.GetStudentById(2);
+ var tuition = actualBll.GetTuition(2);
+ // #断言
Assert.Equal(student.Id + student.Age, tuition);
}
+ #region 清理
public void Dispose()
{
}
+ #endregion
}
}
diff --git a/xUnitStudy.WebApi.Test/TestCaseOrderTest.cs b/xUnitStudy.WebApi.Test/TestCaseOrderTest.cs
new file mode 100644
index 0000000..0fa78dc
--- /dev/null
+++ b/xUnitStudy.WebApi.Test/TestCaseOrderTest.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xunit;
+using Xunit.Abstractions;
+using Xunit.Extensions;
+using Xunit.Sdk;
+
+namespace xUnitStudy.WebApi.Test
+{
+ ///
+ /// 输出窗口的测试选项,显示测试相关信息
+ ///
+ public class TestCaseOrderTest: ITestCaseOrderer
+ {
+ private readonly IMessageSink diagnosticMessageSink;
+
+ public TestCaseOrderTest(IMessageSink diagnosticMessageSink)
+ {
+ this.diagnosticMessageSink = diagnosticMessageSink;
+ }
+
+ public IEnumerable OrderTestCases(IEnumerable testCases) where TTestCase : ITestCase
+ {
+ var result = testCases.ToList(); // Run them in discovery order
+ var message = new DiagnosticMessage("Ordered {0} test cases", result.Count);
+ diagnosticMessageSink.OnMessage(message);
+ return result;
+ }
+ }
+}
diff --git a/xUnitStudy.WebApi.Test/UseAssertTest.cs b/xUnitStudy.WebApi.Test/UseAssertTest.cs
new file mode 100644
index 0000000..2d8c40a
--- /dev/null
+++ b/xUnitStudy.WebApi.Test/UseAssertTest.cs
@@ -0,0 +1,1646 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Xunit;
+using xUnitStudy.Model;
+
+namespace xUnitStudy.WebApi.Test
+{
+ ///
+ /// https://xunit.github.io/docs/comparisons
+ ///
+ [Trait("测试断言分组", "默认组")]
+ public class UseAssertTest : IDisposable
+ {
+ #region 准备
+ public UseAssertTest()
+ {
+
+ }
+ #endregion
+
+ #region Equal
+ [Fact]
+ public void Equal_String_Test()
+ {
+ Assert.Equal("ping", "ping");
+ }
+
+ ///
+ /// 断言 string 相等
+ /// 设置大小写、行尾符、空白符号 比较选项
+ ///
+ [Fact]
+ public void Equal_String_Ignore_Test()
+ {
+ //ignoreCase:忽略字符大小写差异.如果为true,比较时忽略字符大小写
+ Assert.Equal("ABcdEF", "abcdef", ignoreCase: true);
+
+ //ignoreLineEndingDifferences:忽略行尾结束符差异。设置为true,则将\rn、\r和\n视为等效。
+ Assert.Equal("One line\r\n", "one line\n", ignoreCase: true, ignoreLineEndingDifferences: true);
+
+ //ignoreWhiteSpaceDifferences:忽略"空白"(空格、Tab)差异。设置为true,则将空格和制表符(以任何非零量)视为等效。
+ Assert.Equal("One line\r", "one line\n", ignoreCase: true, ignoreLineEndingDifferences: true, ignoreWhiteSpaceDifferences: true);
+ }
+
+ [Fact]
+ public void Equal_Double_Test()
+ {
+ //注意:先舍入,然后再比较
+ //舍入规则:四舍五入
+ //精度范围[0,15]位小数
+
+ Assert.Equal(1.14d, 1.11d, precision: 1);
+ Assert.Equal(1.15d, 1.19d, precision: 1);
+
+ Assert //1.14d 约等于1.1 而1.15d 约等于1.2 所以不相等
+ .NotEqual(1.14d, 1.15d, precision: 1);
+
+ //四舍五入到2位小数精度,相等
+ Assert.Equal(2.123d, 2.124d, 2);
+
+ //四舍五入到3位小数精度,相等
+ Assert.Equal(3.1234d, 3.1231d, 3);
+
+ //四舍五入到4位小数精度,不等
+ Assert.NotEqual(3.12345d, 3.12349d, 4);
+
+ //四舍五入到整数,相等
+ Assert.Equal(15d, 15.111d, precision: 0);
+
+ //没有小数位,四舍五入到整数
+ Assert.Equal(15d, 15d, precision: 0);
+ }
+
+ [Fact]
+ public void Equal_Decimal_Test()
+ {
+ //注意:先舍入,然后再比较
+ //舍入规则:四舍五入
+ //精度范围[0,15]位小数
+
+ Assert.Equal(1.14M, 1.11M, precision: 1);
+ Assert.Equal(1.15M, 1.19M, precision: 1);
+
+ Assert //1.14M 约等于1.1 而1.15M 约等于1.2 所以不相等
+ .NotEqual(1.14M, 1.15M, precision: 1);
+
+ //四舍五入到2位小数精度,相等
+ Assert.Equal(2.123M, 2.124M, 2);
+
+ //四舍五入到3位小数精度,相等
+ Assert.Equal(3.1234M, 3.1231M, 3);
+
+ //四舍五入到4位小数精度,不等
+ Assert.NotEqual(3.12345M, 3.12349M, 4);
+
+ //四舍五入到整数,相等
+ Assert.Equal(15M, 15.111M, precision: 0);
+
+ //没有小数位,四舍五入到整数
+ Assert.Equal(15M, 15M, precision: 0);
+ }
+
+ [Fact]
+ public void Equal_Datetime_Test()
+ {
+ Assert.Equal(DateTime.Now, DateTime.Now.AddSeconds(1), TimeSpan.FromSeconds(2));
+ Assert.Equal(DateTime.Now, DateTime.Now.AddMinutes(1), TimeSpan.FromMinutes(2));
+ }
+
+ ///
+ /// Equal 泛型版本
+ /// 泛型版基本上都有简化写法
+ ///
+ [Fact]
+ public void Equal_Generic_T_Test()
+ {
+ //形如:Assert.Equal(Expected T, Actual T);
+ //常见类型都可以简化,或是有更好的非泛型版,此时,一般用非泛型版
+
+ Assert.Equal("ping", "ping");
+ Assert //基本使用非泛型版本
+ .Equal("ping", "ping");
+
+ Assert.Equal(3, 3);
+ Assert //简化为
+ .Equal(3, 3);
+
+ Assert.Equal(3L, 3L);
+ Assert //简化为
+ .Equal(3L, 3L);
+
+ Assert.Equal(5.5d, 5.5d);
+ Assert //简化为
+ .Equal(5.5d, 5.5d);
+
+ Assert.Equal(5.5M, 5.5M);
+ Assert //简化为
+ .Equal(5.5M, 5.5M);
+
+ Assert.Equal(DateTime.Now.Date, DateTime.Now.Date);
+ Assert //简化为
+ .Equal(DateTime.Now.Date, DateTime.Now.Date);
+
+ //类或其它自定义结构比较,可以使用
+
+ var obj = new object();
+ Assert.Equal