C# 了解如何为单元测试编写代码
我的服务层使用实体框架6。我曾试图模仿实体框架,但没有取得多大成功(向前一步,向后两步),但我认为球已经落到了我的头上。我以前从未真正为单元测试创建过代码,所以它有点新 我的想法对吗,这一切都是关于用一些更“可测试”的函数/动作来编写代码 例如,我有一个AddAsync方法,看起来像这样(非常基本,保持简单)C# 了解如何为单元测试编写代码,c#,.net,entity-framework,unit-testing,testing,C#,.net,Entity Framework,Unit Testing,Testing,我的服务层使用实体框架6。我曾试图模仿实体框架,但没有取得多大成功(向前一步,向后两步),但我认为球已经落到了我的头上。我以前从未真正为单元测试创建过代码,所以它有点新 我的想法对吗,这一切都是关于用一些更“可测试”的函数/动作来编写代码 例如,我有一个AddAsync方法,看起来像这样(非常基本,保持简单) public override async Task AddAsync(FieldGroup t) { //新组将添加到位置中的最后一个位置 var groupCount=await\u
public override async Task AddAsync(FieldGroup t)
{
//新组将添加到位置中的最后一个位置
var groupCount=await\u context.FieldGroups
.OrderBy(e=>e.Position)
.CountAsync();
//如果没有组,请将位置设置为1
//否则,如果设置为等于最后一个位置+1
if(groupCount==0)
{
t、 位置=1;
}
其他的
{
t、 位置=(短)(组计数+1);
}
返回wait base.AddAsync(t);
}
基本上,当我添加我的FieldGroup时,我需要获得正确的位置号来插入它并设置位置
为了使这个更“单元可测试”,我应该将代码从AddAsync函数移到另一个接受数字作为参数的函数中吗。像这样的
public override async Task<int> AddAsync(FieldGroup t)
{
// new groups are added to the last position in the location
var groupCount = await _context.FieldGroups
.Where(e => e.ModuleId == t.ModuleId && e.Location == t.Location)
.WhereNotDeleted()
.OrderBy(e => e.Position)
.CountAsync();
t.Position = GetNextPositionNumber(groupCount);
return await base.AddAsync(t);
}
public short GetNextPositionNumber(int groupCount)
{
// if there is no groups in this location, set position to 1
// else if there is set it equal to the last position + 1
if (groupCount == 0)
{
return 1;
}
else
{
return (short)(groupCount + 1);
}
}
public override async Task AddAsync(FieldGroup t)
{
//新组将添加到位置中的最后一个位置
var groupCount=await\u context.FieldGroups
.其中(e=>e.ModuleId==t.ModuleId&&e.Location==t.Location)
.WhereNotDeleted()
.OrderBy(e=>e.Position)
.CountAsync();
t、 位置=GetNextPositionNumber(groupCount);
返回wait base.AddAsync(t);
}
公共短GetNextPositionNumber(int groupCount)
{
//如果此位置没有组,请将位置设置为1
//否则,如果设置为等于最后一个位置+1
if(groupCount==0)
{
返回1;
}
其他的
{
返回(短)(groupCount+1);
}
}
现在可以在GetNextPositionNumber方法上运行测试,我知道不再需要实体框架来获取任何东西
现在如果您这样做,显然我现在测试的是GetNextPositionNumber方法,而不是AddAsync方法,但是测试AddSync方法应该是稍后一些集成测试的一部分,这将确保整个方法都能工作,我可以使用EF和测试数据库来测试这一点
这是对的,还是我完全没有抓住要点
如果这是错误的,您如何编写测试和模拟EF?每次我解决问题的时候,我好像都撞到墙了。例如,首先可以使用Async模拟EF,然后在实体上设置状态,然后使用Include关键字加载实体。您完全可以这样做。但是,需要了解的是,您不再测试整个
AddAsync
方法,而只测试GetNextPositionNumber
方法。那么,不应该测试AddSync方法,EF之后再进行集成测试吗?当然,它应该作为集成测试的一部分进行测试。但是,仍然没有针对它的单元测试(这可能很好),如果您想测试EF,那么您需要创建一个模拟上下文,以提供适当的实现。一、 但是,您喜欢通过创建一次性数据库来对EF进行单元测试,为它们设定种子,测试它们,然后将它们作为单元测试的一部分删除。这是单元测试和集成测试之间的一条细线,尤其是在ORM方面。最后,您应该选择实现满足您需求的功能。如果您需要知道AddAsync是否可以在数据库级别工作,那么编写一个测试来实现这一点。
public override async Task<int> AddAsync(FieldGroup t)
{
// new groups are added to the last position in the location
var groupCount = await _context.FieldGroups
.Where(e => e.ModuleId == t.ModuleId && e.Location == t.Location)
.WhereNotDeleted()
.OrderBy(e => e.Position)
.CountAsync();
t.Position = GetNextPositionNumber(groupCount);
return await base.AddAsync(t);
}
public short GetNextPositionNumber(int groupCount)
{
// if there is no groups in this location, set position to 1
// else if there is set it equal to the last position + 1
if (groupCount == 0)
{
return 1;
}
else
{
return (short)(groupCount + 1);
}
}