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

