C# 最低起订量不';t在添加新数据后验证DbSet和DbContext上的操作

C# 最低起订量不';t在添加新数据后验证DbSet和DbContext上的操作,c#,moq,xunit,C#,Moq,Xunit,我使用Moq进行了以下xunit测试 [事实] 公共异步void Add_Valid() { //安排 var mockSet=new Mock(); var mockContext=new Mock(); Setup(m=>m.Categories).Returns(mockSet.Object); var categoryProfile=新的CategoryVoProfile(); var configMapper=newmapperconfiguration(cfg=>cfg.AddPro

我使用Moq进行了以下xunit测试

[事实]
公共异步void Add_Valid()
{
//安排
var mockSet=new Mock();
var mockContext=new Mock();
Setup(m=>m.Categories).Returns(mockSet.Object);
var categoryProfile=新的CategoryVoProfile();
var configMapper=newmapperconfiguration(cfg=>cfg.AddProfile(categoryProfile));
IMapper映射器=新映射器(configMapper);
var service=newindbcategoryservice(mockContext.Object,映射器);
//表演
wait service.Add(new CategoryVo(){Name=“CreatedName1”});
//断言
mockSet.Verify(m=>m.Add(It.IsAny()),Times.Once());//DbSet-Verify
mockContext.Verify(m=>m.SaveChanges(),Times.Once());//DbContext验证
}
它抛出了这个错误:

最低起订量。最低起订量例外:
应在模拟上调用一次,但调用次数为0次:m=>m.Add(It.IsAny())

执行的调用:
模拟(m): 没有执行任何调用

当我删除DbSet验证行并要求仅验证DbContext时,它抛出以下命令:

Moq.MockException:
应在模拟上调用一次,但调用次数为0次:m=>m.SaveChanges()

执行的调用:
MockAppContext:1(m):
AppContext.Categories=InternalDbSet
DbContext.Add(CategoryDao)
DbContext.SaveChangesSync(CancellationToken)


简化服务如下所示:

public class InDbCategoryService : IDataServiceAsync<CategoryVo>
{
    private readonly Data.Context.AppContext context;
    private readonly IMapper mapper;
    public InDbCategoryService(Data.Context.AppContext context, IMapper mapper)
    {
        this.context = context;
        this.mapper = mapper;
    }

    public async Task Add(CategoryVo item)
    {
        context.Add(entity: mapper.Map<CategoryDao>(item));
        await context.SaveChangesAsync();
    }
}
公共类InDbCategoryService:IDataServiceAsync
{
私有只读Data.Context.AppContext上下文;
专用只读IMapper映射器;
public InDbCategoryService(Data.Context.AppContext,IMapper映射器)
{
this.context=上下文;
this.mapper=mapper;
}
公共异步任务添加(类别项)
{
Add(实体:mapper.Map(item));
wait context.saveChangesSync();
}
}
类别简介:

public class CategoryVoProfile : Profile
{
    public CategoryVoProfile()
    {
        CreateMap<CategoryDao, CategoryVo>()
            .ReverseMap();
    }
}
public类categoryOprofile:Profile
{
公共类别Oprofile()
{
CreateMap()
.ReverseMap();
}
}
数据库上下文:

public class AppContext : DbContext
{
    public AppContext() { }

    public AppContext (DbContextOptions<AppContext> options) : base(options) { }

    public virtual DbSet<CategoryDao> Categories { get; set; }

}
公共类AppContext:DbContext
{
公共AppContext(){}

public AppContext(DbContextOptions)用于我的测试,但很明显我遗漏了一些内容。非常感谢您提供的任何帮助或建议。

您没有测试您在服务中调用的方法。您的添加方法:

public async Task Add(CategoryVo item)
{
    context.Add(entity: mapper.Map<CategoryDao>(item));
    await context.SaveChangesAsync();
}
public异步任务添加(CategoryVo项)
{
Add(实体:mapper.Map(item));
wait context.saveChangesSync();
}
您会注意到您正在调用DbContext.Add,而不是在测试中验证的context.Categories.Add:

mockSet.Verify(m => m.Add(It.IsAny<CategoryDao>()), Times.Once());
mockSet.Verify(m=>m.Add(It.IsAny()),Times.Once());

您的SaveChanges也是如此。您正在验证同步版本,但调用的是异步版本。因此,您需要修改您正在验证的内容,以匹配您正在使用的内容。

感谢您指出这一点!以防万一-如果其他人需要将.SaveChanges()转换为saveChangesSync(),请确保将默认值作为如下参数传递:SaveChangesAsync(默认值),否则您将得到一种错误替代方法,即不模拟DbContext,而是使用内存提供程序或针对实际数据库测试其操作。模拟DbContext提供的值很小,因为它只是测试调用方法的序列。