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

单元测试中同一接口两次调用返回不同同类型列表配置不生效问题

问题根因

你对_shippingApiClient.GetAllFixedSchedules方法做了两次重复的同规则Setup,Moq默认不会按调用顺序匹配Setup,只会生效最后一次(部分旧版本会保留第一次的配置),因此两次方法调用都会拿到同一个列表,无法实现你要的调用顺序返回不同结果的需求。

解决方案

使用Moq的SetupSequence方法配置按调用顺序返回不同值,替换你测试代码Arrange区域中两次GetAllFixedSchedules的Setup即可,修改后的配置如下:

#region Arrange
var model = new FixedShippingScheduleEditViewModel{Id = 10, Name = "Schedule"};
var schedules = new List<Hyper360FixedShippingScheduleSummaryModel>()
{new Hyper360FixedShippingScheduleSummaryModel{Id = 11, Name = "AnotherSchedule"}};
var refreshedSchedules = new List<Hyper360FixedShippingScheduleSummaryModel>()
{new Hyper360FixedShippingScheduleSummaryModel{Id = 10, Name = "Schedule"}};

// 按调用顺序依次返回对应列表
_shippingApiClient.SetupSequence(x => x.GetAllFixedSchedules(CancellationToken.None))
    .Returns(Task.FromResult((IList<Hyper360FixedShippingScheduleSummaryModel>)schedules)) // 第一次调用(名称校验)返回初始列表
    .Returns(Task.FromResult((IList<Hyper360FixedShippingScheduleSummaryModel>)refreshedSchedules)); // 第二次调用(新增后查询)返回刷新后的列表

_shippingApiClient.Setup(x => x.CreateFixedSchedule(It.Is<FixedShippingScheduleEditModel>(s => s.Name == "Schedule"), CancellationToken.None)).Returns(Task.CompletedTask);
_localizationService.Setup(x => x.GetResource("Bizay.Logistic.Admin.Schedules.Notification.Create.Error")).Returns("Success");
_notificationService.Setup(x => x.SuccessNotification("Success", true));
#endregion

额外注意事项

你当前的测试配置还存在一处资源key匹配的问题:被测代码中新增成功时取的本地化资源key是Bizay.Logistic.Admin.Schedules.Notification.Create.Success,只有新增后查询不到记录时才会取你当前配置的Bizay.Logistic.Admin.Schedules.Notification.Create.Error,如果你的测试场景是验证新增成功分支,需要对应调整本地化服务的Setup规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:45:04