【发布时间】:2021-11-23 07:46:12
【问题描述】:
如果我能解释我的问题,这是两个方法,一个测试方法和它的目标:
测试方法
[Fact]
public async Task Create_Post_Valid_Id_Valid_Name()
{
#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.Setup(x => x.GetAllFixedSchedules(CancellationToken.None)).Returns(Task.FromResult((IList<Hyper360FixedShippingScheduleSummaryModel>)schedules));
_shippingApiClient.Setup(x => x.CreateFixedSchedule(It.Is<FixedShippingScheduleEditModel>(s => s.Name == "Schedule"), CancellationToken.None)).Returns(Task.CompletedTask);
_shippingApiClient.Setup(x => x.GetAllFixedSchedules(CancellationToken.None)).Returns(Task.FromResult((IList<Hyper360FixedShippingScheduleSummaryModel>)refreshedSchedules));
_localizationService.Setup(x => x.GetResource("Bizay.Logistic.Admin.Schedules.Notification.Create.Error")).Returns("Success");
_notificationService.Setup(x => x.SuccessNotification("Success", true));
#endregion
#region Act
var result = await _scheduleController.Create(model, true, CancellationToken.None);
#endregion
#region Assert
result.Should().BeOfType<ViewResult>();
((ViewResult)result).Model.Should().BeOfType<FixedShippingScheduleEditViewModel>();
((FixedShippingScheduleEditViewModel)((ViewResult)result).Model).Name.Should().Be("AnotherSchedule");
((FixedShippingScheduleEditViewModel)((ViewResult)result).Model).Id.Should().Be(11);
#endregion
}
测试方法
[HttpPost]
[ValidateAntiForgeryToken]
[HttpPost, ParameterBasedOnFormName("save-continue", "continueEditing")]
public async Task<ActionResult> Create(FixedShippingScheduleEditViewModel model, bool continueEditing, CancellationToken cancellationToken)
{
var schedules = await _shippingApiClient.GetAllFixedSchedules(cancellationToken);
if (schedules.Any(s => s.Name.Equals(model.Name, StringComparison.InvariantCultureIgnoreCase)))
{
ModelState.AddModelError(nameof(model.Name), _localizationService.GetResource("Bizay.Logistic.Admin.Schedules.Error.Name.Repeated"));
}
if (ModelState.IsValid)
{
await _shippingApiClient.CreateFixedSchedule(new FixedShippingScheduleEditModel { Name = model.Name }, cancellationToken);
var refreshedSchedules = await _shippingApiClient.GetAllFixedSchedules(cancellationToken);
var schedule = refreshedSchedules?.FirstOrDefault(s => s.Name == model.Name);
if (schedule == null)
{
_notificationService.ErrorNotification(_localizationService.GetResource("Bizay.Logistic.Admin.Schedules.Notification.Create.Error"));
return View(model);
}
_notificationService.SuccessNotification(_localizationService.GetResource("Bizay.Logistic.Admin.Schedules.Notification.Create.Success"));
if (continueEditing)
{
return RedirectToAction("Edit", new { id = schedule.Id });
}
else
{
return RedirectToAction("List");
}
}
return View(model);
}
这里发生的情况是 schedules.Any(s => s.Name.Equals(model.Name, StringComparison.InvariantCultureIgnoreCase)) 应该在 schedules 列表上工作,而 refreshedSchedules?.FirstOrDefault(s => s.Name == model.Name) 应该在 refreshedSchedules 列表上工作,问题是两个 lambda 都在作用于 schedules清单,知道我该如何完成这项工作吗?
【问题讨论】:
-
您的minimal reproducible example 缺少
ToIList方法... -
尝试在 GetAllFixedSchedules 的设置中使用 It.Is<...>(...)。
-
@AlexeiLevenkov
public IList<T> ToIList<T>(List<T> t) { return t; } -
@AlexeiLevenkov 我用演员替换了
ToIlist。 -
我自己也去过那里。有时在我们寻求简化的过程中,它删除了太多的上下文。通过练习找到平衡。
标签: c# unit-testing asp.net-core .net-core