C# 最低起订量不';t在添加新数据后验证DbSet和DbContext上的操作
我使用Moq进行了以下xunit测试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
[事实]
公共异步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提供的值很小,因为它只是测试调用方法的序列。