Мы помещаем все наши модульные тесты в свои собственные проекты. Мы обнаруживаем, что нам нужно сделать определенные классы общедоступными, а не внутренними только для модульных тестов. Есть ли способ избежать этого? Каковы последствия для памяти, если сделать классы общедоступными, а не закрытыми?
c#
unit-testing
scope
Лиора
источник
источник
Ответы:
Если вы используете .NET, атрибут сборки InternalsVisibleTo позволяет создавать «дружественные» сборки. Это конкретные сборки со строгими именами, которым разрешен доступ к внутренним классам и членам другой сборки.
Обратите внимание, что это следует использовать с осторожностью, поскольку он тесно связывает задействованные сборки. Обычно InternalsVisibleTo используется для проектов модульного тестирования. Вероятно, это не лучший выбор для использования в ваших реальных сборках приложений по указанной выше причине.
Пример:
источник
Если это внутренний класс, его нельзя использовать изолированно. Поэтому вам не следует тестировать его, кроме тестирования какого-либо другого класса, который использует этот объект внутри.
Так же, как вы не должны тестировать частные члены класса, вы не должны тестировать внутренние классы DLL. Эти классы являются деталями реализации некоторого общедоступного класса и поэтому должны хорошо проверяться с помощью других модульных тестов.
Идея состоит в том, что вы хотите протестировать только поведение класса, потому что если вы тестируете детали внутренней реализации, ваши тесты будут хрупкими. Вы должны иметь возможность изменять детали реализации любого класса, не нарушая всех ваших тестов.
Если вы обнаружите, что вам действительно нужно протестировать этот класс, то, возможно, вы захотите еще раз проверить, почему этот класс вообще является внутренним.
источник
для документации
в качестве альтернативы вы можете создать экземпляр внутреннего класса с помощью
Type.GetType
методапример
для универсального типа есть другой процесс, как показано ниже:
источник
Классы могут быть как общедоступными, так и запечатанными.
Но не делай этого.
Вы можете создать инструмент для отражения внутренних классов и создать новый класс, который будет обращаться ко всему через отражение. MSTest делает это.
Изменить: я имею в виду, если вы не хотите включать какие-либо тестовые материалы в исходную сборку; это также работает, если участники являются частными.
источник
public sealed class
? Что вы думаете об этом драгоценном камне?