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

Moq配置LoadAsync时Returns()与FromResult()的使用问题

问题:使用Moq模拟返回值元组的异步方法

我正在开发基于.NET 6的MSTest测试项目,需要用Moq为IDataAccess接口的异步方法构建单元测试。

接口定义

IDataAccess接口的方法签名如下:

Task<(TypeA, Resource[,])> LoadAsync(Int32 size);

FileDataAccess类是该接口的具体实现。

测试类私有字段

测试类UnitTest.cs中有以下私有字段:

private Resource[,] _mockedTable = null!; 
private Mock<IDataAccess> _mock = null!;
private TypeA _a = null;

当前待完善的代码

我需要完善_mock.Setup(...)语句,当前代码如下:

_mockedTable = new Resource[100, 100];

_mock = new Mock<IDataAccess>();

_mock.Setup(mock => mock.LoadAsync(It.IsAny<Int32>()))
                .Returns(() => Task.FromResult( ));

解决方案

要正确模拟返回值元组的异步方法,需要在Task.FromResult中传入值元组实例,同时要确保_a已完成初始化(不能为null)。

完整代码示例

// 先初始化_a,根据TypeA的构造函数调整实例化逻辑
_a = new TypeA();
_mockedTable = new Resource[100, 100];

_mock = new Mock<IDataAccess>();

// 完善Setup的Returns部分,返回包含_a和_mockedTable的元组任务
_mock.Setup(mock => mock.LoadAsync(It.IsAny<int>()))
     .Returns(() => Task.FromResult( (_a, _mockedTable) ));

关键说明

  • 值元组使用(item1, item2)语法,直接将已初始化的_a和_mockedTable组合成元组即可。
  • 若TypeA是引用类型,必须先实例化_a(比如new TypeA()),否则会因null导致测试异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:50:25