C# 模拟插入返回0作为实体.Id,但在应用程序托管并使用Curl请求时工作 公共类文章控制器:控制器 { 私有只读IArticleRepository\u articleRepository; 公共物品管理员(IArticleRepository articleRepository) { _articleRepository=articleRepository; } 公共异步任务发布([FromBody]ArticleModel模型) { var article=通过模型中的填充输入创建article对象; wait_articlepository.InsertAsync(article); 创建的返回($“articles/{article.Id}”,article); } } 公共接口IArticleRepository:IGenericRepository { } 公共抽象类GenericRepository:IGenericRepository 其中T:BaseEntity,new() { 公共异步任务插入同步(T实体) { _dbContext.Set().Add(实体); wait_dbContext.saveChangesSync(); } }

C# 模拟插入返回0作为实体.Id,但在应用程序托管并使用Curl请求时工作 公共类文章控制器:控制器 { 私有只读IArticleRepository\u articleRepository; 公共物品管理员(IArticleRepository articleRepository) { _articleRepository=articleRepository; } 公共异步任务发布([FromBody]ArticleModel模型) { var article=通过模型中的填充输入创建article对象; wait_articlepository.InsertAsync(article); 创建的返回($“articles/{article.Id}”,article); } } 公共接口IArticleRepository:IGenericRepository { } 公共抽象类GenericRepository:IGenericRepository 其中T:BaseEntity,new() { 公共异步任务插入同步(T实体) { _dbContext.Set().Add(实体); wait_dbContext.saveChangesSync(); } },c#,unit-testing,nunit,moq,C#,Unit Testing,Nunit,Moq,-- 当我模拟插入时,它返回0作为entity.Id,但当我在托管应用程序后运行时。插入工作并返回entity.id>0。我做错了什么?我对moq和单元测试还很陌生 --试验方法 public abstract class GenericRepository<T> : IGenericRepository<T> where T : BaseEntity, new() { public async Task InsertAsync(T entity

-- 当我模拟插入时,它返回0作为entity.Id,但当我在托管应用程序后运行时。插入工作并返回entity.id>0。我做错了什么?我对moq和单元测试还很陌生 --试验方法

public abstract class GenericRepository<T> : IGenericRepository<T>
        where T : BaseEntity, new()
    {
 public async Task InsertAsync(T entity)
        {
            _dbContext.Set<T>().Add(entity);
            await _dbContext.SaveChangesAsync();
        }
    }
private Mock\u articleRepositoryMock=new Mock();
公共物品控件测试()
{
_articlesController=新的articlesController(\u articleRepositoryMock.Object);
}
[事实]
公共异步任务Post_SingleItem()
{
var article=Builder.CreateNew().Build();
_articleRepositoryMock.As().Setup(m=>m.InsertAsync(article)).Returns(Task.CompletedTask);
var result=await\u articlesController.Post(atricleModel);
//将结果强制转换到所需对象并检查后进行验证。Id>0失败
}

您在哪里定义模拟对象的ID?您是否调试了测试并查看了模拟对象的ID?位于(var article=Builder.CreateNew().Build();)的模拟对象确实有ID,但一旦它被传递给控制器。只有ID(EF中的数据库主键)以外的所需参数被填充并发送到InsertAsync。成功保存时,EF不会生成Id吗?如果您模拟存储库,则它不会与EF交互。这就是模拟的意义。抱歉,模拟对象在成功处理InsertAsync时不会返回ID?我只能使用Assert。验证该方法是否在任务成功时调用过一次。已完成?模拟将执行您让它执行的任何操作。在本例中,您告诉mock返回
Task.CompletedTask
。这就是它的全部功能。
public interface IArticleRepository : IGenericRepository<Article>
    {
    }
public abstract class GenericRepository<T> : IGenericRepository<T>
        where T : BaseEntity, new()
    {
 public async Task InsertAsync(T entity)
        {
            _dbContext.Set<T>().Add(entity);
            await _dbContext.SaveChangesAsync();
        }
    }
     private Mock<IArticleRepository> _articleRepositoryMock = new Mock<IArticleRepository>();

        public ArticlesControllerTests()
        {
            _articlesController = new ArticlesController(_articleRepositoryMock.Object);
        }

 [Fact]
        public async Task Post_SingleItem()
        {
            var article = Builder<Article>.CreateNew().Build();
            _articleRepositoryMock.As<IGenericRepository<Article>>().Setup(m=>m.InsertAsync(article)).Returns(Task.CompletedTask);

            var result = await _articlesController.Post(atricleModel);

            //verify after casting the result to desired object and check .Id > 0 fails


        }