我在我的应用程序中使用XUnit实现单元测试,我将autofac作为我的DI。 autofac documentaion使用Autofac.Extras.Moq.AutoMock进行推荐。我对此完全陌生,并且一直在关注已记录的示例,但我无法使其正常工作。这是我用来生成测试的代码:
using (var mock = AutoMock.GetLoose())
{
mock.Mock<IScheduleService>().Setup(m => m.GenerateSchedule(request)).Returns(response);
var sut = mock.Create<ScheduleService>();
var actual = sut.GenerateSchedule(request);
mock.Mock<IScheduleService>().Verify(x => x.GenerateSchedule(request));
Assert.Equal(response.Schedules, actual.Schedules);
}
测试中的方法基本上会返回一个&#39; schedule&#39;对象(日期和时间)所以我模拟了一个有效的响应,该方法将从其输入返回。调用该方法并运行代码并返回一个对象(调度列表),但是我收到此错误并且测试失败
ApplicationService.Tests.Schedule.ScheduleServiceTest.TestDailyScheduleCreation [FAIL]
[xUnit.net 00:02:33.7051040] Moq.MockException :
Expected invocation on the mock at least once, but was never performed: x => x.GenerateSchedule()
[xUnit.net 00:02:33.7089101]
[xUnit.net 00:02:33.7096712] Configured setups:
[xUnit.net 00:02:33.7101336] m => m.GenerateSchedule()
[xUnit.net 00:02:33.7134611] No invocations performed.
由于我之前没有使用过XUnit和Moq,我真的不确定这里发生了什么,有谁能告诉我哪里出错了?
继承了被测系统
private List<ScheduleDto> CalculateDaily(DateTime startDate, DateTime endDate, TimeSpan GenerationTimeUTC, long scheduleId)
{
List<ScheduleDto> schedulesList = new List<ScheduleDto>();
var numOfDays = (endDate - startDate).TotalDays;
for (int i = 0; i < numOfDays ; i++)
{
ScheduleDto newSchedule = new ScheduleDto();
newSchedule.GenerationDate = startDate.AddDays(i);
newSchedule.GenerationTimeUTC = GenerationTimeUTC;
newSchedule.ScheduleID = scheduleId;
newSchedule.IsEmailed = false;
newSchedule.IsGenerated = false;
schedulesList.Add(newSchedule);
}
return schedulesList;
}
这是请求对象
ScheduleGenerationRequest request = new ScheduleGenerationRequest(0);
CreateScheduleRequest response = new CreateScheduleRequest(0);
request.StartDate = new DateTime(2017, 7, 17);
request.EndDate = request.StartDate.AddDays(7);
request.Frequency = EnumHelper.ScheduleFrequency.Daily;
request.FrequencyPeriod = 1;
TimeSpan timeSpan = new TimeSpan(19, 00, 00);
request.GenerationTimeUTC = timeSpan;
这是服务类
中的主要方法public CreateScheduleRequest GenerateSchedule(ScheduleGenerationRequest request)
{
CreateScheduleRequest response = new CreateScheduleRequest(request.Id);
List<ScheduleDto> result = new List<ScheduleDto>();
switch (request.Frequency)
{
case EnumHelper.ScheduleFrequency.Daily:
result = CalculateDaily(request.StartDate,request.EndDate, request.GenerationTimeUTC,request.Id);
break;
case EnumHelper.ScheduleFrequency.Weekly:
result = CalculateWeekly(request.StartDate, request.EndDate, request.GenerationTimeUTC, request.Id, request.PrintDaySpecifier, request.FrequencyPeriod);
break;
case EnumHelper.ScheduleFrequency.Monthly:
break;
case EnumHelper.ScheduleFrequency.Yearly:
break;
}
response.Schedules = result;
return response;
}