使用XUnit进行单元测试

时间:2017-07-24 10:19:26

标签: c# moq autofac xunit.net

我在我的应用程序中使用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;
    }

0 个答案:

没有答案