Можете ли вы посмеяться над внутренним свойством? - PullRequest
3 голосов
/ 12 июля 2011
//class = Person
public string Name { get; internal set; }

У меня есть объект с несколькими различными полями, которые объявлены, как показано выше. Я хотел бы использовать Moq, чтобы я мог модульное тестирование хранилища. Репозиторий просто возвращает список имен, поэтому я хотел бы настроить Moq для работы с ним так:

var personRepositoryMock = new Mock<IPersonRepository>();

personRepositoryMock
        .Setup(p => p.GetNames())
        .Returns(new List<Person>
        {
            new Person{Name = "Hulk Hogan"}
        });

Будучи новичком в издевательствах и юнит-тестировании в целом, у меня есть пара вопросов:

  1. Какие у меня есть варианты заглушить класс Person в моем сценарии?

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

Спасибо.

1 Ответ

4 голосов
/ 12 июля 2011

1) Вы можете использовать атрибут "InternalsVisibleTo" в сборке (в AssemblyInfo.cs), содержащей класс репозитория, чтобы предоставить доступ к сборке Moq.

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
[assembly: InternalsVisibleTo("YourTestClass")]

2) Mocking отделяет ваш слой данных от требований зависимости для юнит-тестов.

Подумайте об этом так: вы не будете создавать Mock для тестирования самого хранилища. Вы создаете макет для использования другими классами в качестве источника поддельных данных, чтобы проверить их функциональность, для которой требуются входные данные из хранилища в реальном приложении.

Если вы можете точно предсказать случаи данных, которые предоставит ваш репозиторий, то вы можете смоделировать эти случаи как ложные входные данные и не требовать, чтобы ваши модульные тесты действительно подключались к базе данных для получения действующих данных.

Ваш пример на самом деле ничего не будет тестировать модулем в репозитории (кроме конструктора без параметров!), Так что ... я не знаю, где вы видите эти примеры, но я не чувствую, что код выше предоставляет что-нибудь полезное "как есть".

...