Moq - не переопределяемые элементы не могут использоваться в выражениях настройки / проверки - PullRequest
2 голосов
/ 05 июля 2019

Я новичок в Мок.Я издеваюсь над PagingOptions классом.Вот как выглядит класс:

public class PagingOptions
    {
        [Range(1, 99999, ErrorMessage = "Offset must be greater than 0.")]
        public int? Offset { get; set; }

        [Range(1, 100, ErrorMessage = "Limit must be greater than 0 and less than 100.")]
        public int? Limit { get; set; }

        public PagingOptions Replace(PagingOptions newer)
        {
            return new PagingOptions
            {
                Offset = newer.Offset ?? Offset,
                Limit = newer.Limit ?? Limit
            };
        }
    }

Вот моя ложная версия класса,

var mockPagingOptions = new Mock<PagingOptions>();
            mockPagingOptions.Setup(po => po.Limit).Returns(25);
            mockPagingOptions.Setup(po => po.Offset).Returns(0);

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

moq error

Спасибо, Абдул

1 Ответ

6 голосов
/ 05 июля 2019

Moq создает реализацию порицаемого типа. Если тип является интерфейсом, он создает класс, который реализует интерфейс. Если тип является классом, он создает унаследованный класс, и члены этого унаследованного класса вызывают базовый класс. Но для этого нужно переопределить членов. Если в классе есть члены, которые нельзя переопределить (они не являются виртуальными, абстрактными), тогда Moq не сможет переопределить их, чтобы добавить свое поведение.

В этом случае нет нужды издеваться над PagingOptions, потому что реальную легко использовать. Вместо этого:

var mockPagingOptions = new Mock<PagingOptions>();
        mockPagingOptions.Setup(po => po.Limit).Returns(25);
        mockPagingOptions.Setup(po => po.Offset).Returns(0);

Сделайте это:

var pagingOptions = new PagingOptions { Limit = 25, Offset = 0 };

Как мы определяем, стоит ли что-то издеваться? Вообще говоря, мы что-то высмеиваем, если не хотим включать конкретную реализацию времени выполнения в наш тест. Мы хотим протестировать один класс, а не оба одновременно.

Но в этом случае PagingOptions - это просто класс, содержащий некоторые данные. Там действительно нет смысла насмехаться над этим. Использовать настоящую вещь так же просто.

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