Я новичок в модульном тестировании и пытаюсь понять, стоит ли мне начинать использовать больше «внутреннего» модификатора доступа. Я знаю, что если мы используем 'internal' и устанавливаем переменную сборки 'InternalsVisibleTo', мы можем тестировать функции, которые не хотим объявлять общедоступными из проекта тестирования. Это заставляет меня думать, что я должен всегда использовать «внутренний», потому что, по крайней мере, у каждого проекта (должен?) Есть свой собственный проект тестирования. Ребята, вы можете сказать мне причину, почему я не должен этого делать? Когда я должен использовать «частный»?
c#
.net
unit-testing
tdd
Hertanto Lie
источник
источник
System.Diagnostics.Debug.Assert()
сами методы.Ответы:
Внутренние классы должны быть проверены и есть атрибут сборки:
Добавьте это в файл информации о проекте, например
Properties\AssemblyInfo.cs
.источник
private
, но слишком многоprivate
вещей могут очень хорошо указать наinternal
класс, который изо всех сил пытается быть извлеченным. TDD или нет TDD, я предпочитаю иметь больше тестов, которые тестируют много кода, чем иметь несколько тестов, которые выполняют одинаковое количество кода. А уклонение от тестированияinternal
не совсем помогает достичь хорошего соотношения.#if DEBUG
,#endif
блок включит эту опцию только в отладочных сборках.Если вы хотите проверить личные методы, посмотреть на
PrivateObject
иPrivateType
вMicrosoft.VisualStudio.TestTools.UnitTesting
пространстве имен. Они предлагают простые в использовании обертки вокруг необходимого кода отражения.Документы: PrivateType , PrivateObject
Для VS2017 и 2019 вы можете найти их, загрузив nuget MSTest.TestFramework
источник
Добавив ответ Эрика, вы также можете настроить это в
csproj
файле:Или, если у вас есть один тестовый проект на тестируемый проект, вы можете сделать что-то вроде этого в вашем
Directory.Build.props
файле:См .: https://stackoverflow.com/a/49978185/1678053
Пример: https://github.com/gldraphael/evlog/blob/master/Directory.Build.props#L5-L12.
источник
Продолжайте использовать приват по умолчанию. Если член не должен быть представлен вне этого типа, он не должен быть представлен вне этого типа, даже внутри одного и того же проекта. Это делает вещи более безопасными и аккуратными - когда вы используете объект, становится понятнее, какие методы вы должны использовать.
Сказав это, я думаю, что было бы разумно иногда делать внутренние методы естественными для тестирования. Я предпочитаю использовать рефлексию, что недружественно.
Одна вещь, которую следует учитывать, может быть суффиксом «ForTest»:
Затем, когда вы используете класс в одном и том же проекте, становится очевидным (сейчас и в будущем), что вы не должны использовать этот метод на самом деле - он используется только для целей тестирования. Это немного глупо, и я не занимаюсь этим самостоятельно, но это, по крайней мере, заслуживает рассмотрения.
источник
ForTest
подход, но всегда нахожу его уродливым (добавление кода, который не дает никакой реальной ценности с точки зрения производственной бизнес-логики). Обычно я нахожу, что мне пришлось использовать этот подход, потому что дизайн несколько неудачен (то есть приходится сбрасывать единичные экземпляры между тестами)ForTest
, явно ошибочен, в то время как если вы просто сделаете метод внутренним, это будет выглядеть нормально.Вы также можете использовать private и вызывать private методы с отражением. Если вы используете Visual Studio Team Suite, у него есть приятная функциональность, которая генерирует прокси для вызова ваших личных методов. Вот статья проекта кода, которая демонстрирует, как вы можете выполнить работу самостоятельно для тестирования отдельных и защищенных методов:
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
С точки зрения того, какой модификатор доступа вы должны использовать, мое общее эмпирическое правило - начинать с приватного и увеличивать по мере необходимости. Таким образом, вы будете раскрывать как можно меньше внутренних деталей вашего класса, и это поможет скрыть детали реализации, как и должно быть.
источник
Я использую
Dotnet 3.1.101
и.csproj
дополнения, которые работали для меня были:Надеюсь, это поможет кому-то там!
источник