You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Moq中ReturnAsync能否直接返回已有对象的技术咨询

能否在Moq的ReturnsAsync中返回已创建的List对象?

当然可以直接返回已创建好的List对象,你写的第二种写法完全合法。

两种写法的核心区别在于返回的实例是否唯一:

  • 第一种写法(ReturnsAsync(new List<Foo>())):每次调用被Mock的异步方法时,都会生成一个全新的List<Foo>实例。也就是说,每次调用拿到的都是独立的空列表,互相之间不会影响。
  • 第二种写法(提前创建list再传入ReturnsAsync(list)):所有调用被Mock的方法时,都会返回同一个List<Foo>实例。因为List是引用类型,如果你在后续测试代码里修改这个list(比如添加/删除元素),那么所有Mock调用返回的结果都会跟着变化。

举个实际测试场景的例子:

// 提前创建并初始化列表
var testList = new List<Foo> { new Foo { Id = 1 } };

// 设置Mock返回这个已创建的列表
mockRepository.Setup(repo => repo.GetFoosAsync())
              .ReturnsAsync(testList);

// 第一次调用Mock方法,拿到的是testList本身
var result1 = await mockRepository.Object.GetFoosAsync();
Console.WriteLine(result1.Count); // 输出1

// 修改原列表
testList.Add(new Foo { Id = 2 });

// 第二次调用Mock方法,拿到的还是同一个列表,已经包含新增元素
var result2 = await mockRepository.Object.GetFoosAsync();
Console.WriteLine(result2.Count); // 输出2

如果你希望每次Mock调用都返回独立的列表,就用第一种写法;如果需要在测试中复用同一个列表实例(比如验证状态变化),第二种写法就很合适。

内容的提问来源于stack exchange,提问作者Jason Hunter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:04:58