如何使用Moq在C#中模拟带GUID参数的序列方法
Moq SetupSequence 使用 It.IsAny 报错解决
问题场景
业务代码逻辑:
var allBookedPos = await _dataService.GetAllBookingsForVendorInAwitingApproval(purchaseOrder.VendorCode); foreach (var booking in allBookedPos) { // 获取对应采购单 var po = await _purchaseOrderDataService.GetPurchaseOrderOnlyByIdAsync(booking.PurchaseOrderId); }
已成功Mock第一个异步方法,返回2条记录:
BookingDataAccessMock.Setup(x => x.GetAllBookingsForVendorInAwitingApproval("A1248").Result).Returns(viewBookings);
需要Mock GetPurchaseOrderOnlyByIdAsync(参数为Guid),希望该方法被调用两次,尝试用SetupSequence时:
PurchaseOrderDataMock.SetupSequence(X => X.GetPurchaseOrderByIdAsync(It.IsAny<Guid>)).Returns().Returns()
出现编译错误:
Argument 1 cannot convert from method group to system.Guid
错误原因
It.IsAny<Guid> 是方法调用,不是属性,必须添加括号 () 才能正确生成匹配器,否则编译器会把它识别为方法组,无法转换为Guid类型参数。
修正方案
- 补全
It.IsAny<Guid>()的括号 - 异步方法Mock使用
ReturnsAsync而非Returns,确保返回正确的Task对象 - 确保Mock的方法名和业务代码中调用的完全一致(注意原代码中是
GetPurchaseOrderOnlyByIdAsync,不是GetPurchaseOrderByIdAsync)
修正后的代码示例:
// 预先定义两个要返回的采购单对象 var po1 = new PurchaseOrder { /* 填充属性 */ }; var po2 = new PurchaseOrder { /* 填充属性 */ }; PurchaseOrderDataMock.SetupSequence(x => x.GetPurchaseOrderOnlyByIdAsync(It.IsAny<Guid>())) .ReturnsAsync(po1) .ReturnsAsync(po2);
额外优化建议
第一个Mock中直接取.Result的写法不规范,建议改用异步Mock的标准写法:
BookingDataAccessMock.Setup(x => x.GetAllBookingsForVendorInAwitingApproval("A1248")) .ReturnsAsync(viewBookings);
内容的提问来源于stack exchange,提问作者bilpor
相关产品推荐
相关产品推荐

