Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 了解如何为单元测试编写代码_C#_.net_Entity Framework_Unit Testing_Testing - Fatal编程技术网

C# 了解如何为单元测试编写代码

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

我的服务层使用实体框架6。我曾试图模仿实体框架,但没有取得多大成功(向前一步,向后两步),但我认为球已经落到了我的头上。我以前从未真正为单元测试创建过代码,所以它有点新

我的想法对吗,这一切都是关于用一些更“可测试”的函数/动作来编写代码

例如,我有一个AddAsync方法,看起来像这样(非常基本,保持简单)

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);
    }
}