关于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
相关产品推荐
相关产品推荐

