2017-01-04 14 views
2

Последняя инфраструктура xunit не позволяет тестировать бегунов в библиотечном коде при компиляции с .Net Core framework (это разрешено для обычного кода Visual Studio). Решение состоит в том, чтобы создать отдельный тестовый проект для запуска тестовых примеров.. Основная библиотека ядра. Как проверить частные методы с помощью xUnit

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые методы, которые я хочу протестировать, являются «частными» методами. Как я могу вызвать эти методы из моего тестового проекта, не делая их область видимой?

Более общий вопрос: Как вы можете проверять частные методы, когда общедоступный метод, использующий закрытый метод, не может быть использован? (из-за своей интерактивной природы - то есть, он имеет ReadLine(), содержащийся в нем)


Возможные решения:
1) делают частные методы общественного и переименовывать их таким образом, чтобы что они не должны использоваться снаружи. (Используйте «частный» или «внутренний» как часть имени)
2) Создайте поле «public static bool Testflag», которое может быть установлено в true, чтобы обойти интерактивные части публичного метода, чтобы обеспечить тестирование всех его частей.

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

+7

Общий ответ на этот вопрос - рассматривать интерактивную часть как услугу и скрывать ее за интерфейсом (ваш может быть назван «IInputRequester» или аналогичным). Тогда ваш unit-test может передать издеваемую реализацию этого интерфейса ('MockInputRequester'), в то время как ваш производственный код может передать реальную реализацию этого интерфейса (' ConsoleInputRequester'). Обратите внимание, что это не просто то, что вы делаете для модульного тестирования. Это стандартная часть создания [SOLID] (https://en.wikipedia.org/wiki/SOLID_ (object-oriented_design)) дизайна. –

+0

Также выглядит так, что общедоступный метод тесно связан с проблемами реализации, которые затрудняют тестирование. Это признак того, что дизайн нуждается в рефакторинге. (запах кода) – Nkosi

ответ

9

быстрое решение сделать private пользователей, которые вы хотите проверить internal.

вы можете добавить атрибут InternalsVisibleTo к AssemblyInfo.cs вашей главной библиотеки. Это позволит тестовую библиотеку (и никакой другой библиотеки, без отражение) доступ к внутренним методам/классам в вашей основной библиотеке.

, например.

[assembly: InternalVisibleTo("Library.Tests")]