Подтвердить что ты не робот

Является ли неправильной практикой использование InternalsVisibleTo для Unit Test Code?

Пример кода в фреймворке AssemblyInfo.cs:

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo
                          ("Test.Company.Department.Core")]

Это плохая практика?

4b9b3361

Ответ 1

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

Ответ 2

Лично я думаю, что все в порядке. Я никогда не соглашался с догмой "только проверять общественные методы". Я думаю, что хорошо также иметь тестирование черного ящика, но тестирование с помощью белого ящика может позволить вам протестировать больше сценариев с более простыми тестами, особенно если ваш API достаточно "коренастый", а общественные методы на самом деле выполняют довольно много работы.

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

Ответ 3

Я думаю, что это вполне разумно сделать.

Я считаю, что это очень полезно для инъекций зависимостей. Если у меня есть класс с конструктором, который принимает несколько зависимостей, чтобы позволить ему быть модульным, я часто отмечаю его как внутреннее и выставляю его в моем проекте unit test. Тогда у меня будет открытый (без параметров или, по крайней мере, с гораздо меньшими параметрами) конструктор. Это позволяет публичному интерфейсу очистить и по-прежнему позволяет тестировать код.

Ответ 4

Нет, когда используется правильно, потому что в некоторых сценариях это необходимо. Например, у вас есть unit test A, который должен проверить открытый член сборки B, который использует некоторый внутренний тип, также определенный в сборке B. unit test нужен этот тип, поэтому вы должны использовать InternalsVisibleTo.

Он также полезен для защиты кода. Например, это сборка Активации. Вам может потребоваться только один модуль в вашем решении для доступа к вашей сборке активации и запретить кому-либо добавлять ссылку на него и методы вызова. Вы можете сделать типы и члены внутренними, выставить их только на подписанную сборку с токеном открытого ключа и скрытым от остального мира.

Ответ 5

InternalsVisibleTo может быть полезна, если вам нужно протестировать подчасти вашего API, которые вы не хотите раскрывать.

Однако тестирование через публичный API предпочтительнее, поскольку упрощает рефакторинг межсайтовых API. Используйте InternalsVisibleTo с осторожностью и только при необходимости, например. размер API значителен.