Переменные-члены Moq не выдают ошибку для неверной установки - PullRequest
1 голос
/ 10 февраля 2020

Я целенаправленно пытаюсь передать неверную настройку для moq и ожидаю ошибку. Я передаю класс в мой метод установки, где я хотел бы, чтобы переменные экземпляра соответствовали определенным критериям. Поскольку я создаю новый экземпляр класса, я ожидаю ошибки, поскольку все переменные экземпляра равны null. Тем не менее, ничего не брошено?

        var mockParams = new object[] { mockRequestRepo.Object, mockNotificationSvc.Object, mockLogger.Object, mockNotificationBuilder.Object };
        var mockActivityReportBO = new Mock<ActivityReport>(mockParams);
        // Instance variables for class.
        mockActivityReportBO.Setup(x => x.AddReport(It.Is<ActivityReport>(
            x => x.Title == It.IsAny<string>()
            && x.Limits == It.IsAny<string>()
            && x.Description == It.IsAny<string>()
            && x.DueDate == It.IsInRange(DateTime.Now.AddDays(12), DateTime.MaxValue, Range.Inclusive)
            && x.CountyNumber == It.IsInRange(1, 5, Range.Inclusive)
            && x.ActivityReportID == It.IsInRange(1, 12, Range.Inclusive)
        )));
        var report = new ActivityReport();
        // No error thrown
        mockActivityReportBO.Object.AddReport(report);

1 Ответ

2 голосов
/ 10 февраля 2020

Во-первых, по замыслу, он не будет выдавать исключение, если поведение макета не строгое.

Ссылка Moq Быстрый старт: Настройка поведения макета

Make mock ведет себя как «истинный Mock», вызывая исключения для всего, что не имеет соответствующего ожидания: в слоге Moq - «Strict» mock; поведение по умолчанию - «Свободный» макет, который никогда не выдает и возвращает значения по умолчанию или пустые массивы, перечислимые значения и т. Д. c. если для члена не установлено ожидание

примечание: выделено мое

var mock = new Mock<IFoo>(MockBehavior.Strict);

Во-вторых, Setup не выполняется правильно путем создания Сопоставление аргументов вне выражения Setup

mockActivityReportBO.Setup(_ => _.AddReport(It.Is<ActivityReport>(
        x => x.Title == It.IsAny<string>()
        && x.Limits == It.IsAny<string>()
        && x.Description == It.IsAny<string>()
        && x.DueDate == It.IsInRange(DateTime.Now.AddDays(12), DateTime.MaxValue, Range.Inclusive)
        && x.CountyNumber == It.IsInRange(1, 5, Range.Inclusive)
        && x.ActivityReportID == It.IsInRange(1, 12, Range.Inclusive)
    )
));

Ссылка Moq Быстрый старт: Соответствующие аргументы

Обновление

Мне бы хотелось ложное исключение, которое выдается, когда я передаю параметр, который содержит данные за пределами настройки. Например, если я пытаюсь вызвать add report и передаю объект отчета, в котором переменная-член Title = null, я хотел бы выдать исключение.

Укажите, что ожидать, и сообщите Настройка для выдачи исключения, когда это происходит

Например,

mockActivityReportBO
    .Setup(x => x.AddReport(It.Is<ActivityReport>(y => y.Title == null)))
    .Throws<InvalidOperationException>(); //<-- replace with desired Exception

Выше приведено исключение, когда вы передаете объект отчета, где переменная-член Title = null, в макет. (Использование режима поведения по умолчанию «Свободный», конечно. Не «Строгий»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...