首先,编写单元测试主要是为了检测自己所编写的方法是否可以通过运行,这是我的理解,原理应该是判断输出结果是否一样来间接判断方法是否正确(至少我是这么理解的),好处就是这样可以避免代码一次性打完出现bug不好调试的问题。
然后单元测试应该主要包括三个方面:(1)做一个假数据 (2)mock方法 (3)assert方法输出与自己做的假数据是否一致。
接下来看一个实例:
public List<JobRoleQto> FindJobRoles()
{
var jobRoles = _pantheradbcontext
.JobRoles
.OrderBy(it => it.Name)
.Select(it => new JobRoleQto()
{
Id = it.Id,
Name = it.Name
}).ToList();
return jobRoles;
}
上面是待测试的方法;
按照步骤:(方法前需要加[fact] 系统才可以把它当作测试)
首先做一个假数据,代码如下:
var fixture = new Fixture();
var locationSourceList = fixture
.Build<OfficeLocation>()
.CreateMany(3)
.Select((it, index) =>
{
it.Name = $"{3 - index}{it.Name}";
return it;
}).ToList();
其次做一个mock方法:
var mockDbSet = locationSourceList.ToMockDbSet();
var mockDbContext = new Mock<PantheraDbContext>();
mockDbContext.Setup(it => it.OfficeLocations).Returns(mockDbSet.Object);
//Act
var manageQuery = new ManageQuery(mockDbContext.Object);
var findLocations = manageQuery.FindOfficeLocations();
最后使用assert方法检测是否一致:
Assert.Equal(jobRoleSourceList[0].Id, findJobRoles[2].Id);
Assert.Equal(jobRoleSourceList[0].Name, findJobRoles[2].Name);
Assert.Equal(jobRoleSourceList[2].Id, findJobRoles[0].Id);
Assert.Equal(jobRoleSourceList[2].Name, findJobRoles[0].Name);
单元测试写完要记得运行一下,
因为刚学到这,可能有些阐述的不太清楚,主要为了理解这个过程。