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

如何使用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类型参数。

修正方案

  1. 补全 It.IsAny<Guid>() 的括号
  2. 异步方法Mock使用 ReturnsAsync 而非 Returns,确保返回正确的Task对象
  3. 确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:47:05