Почему для атрибутов модульного тестирования обычно требуются общедоступные методы?

12

Недавно я заметил, что добавление [TestInitialize] к защищенному методу в сборке .NET не было принято, но если я сделал метод общедоступным, он был вызван модулем модульного теста (в данном случае Resharper). Я заметил это несколько раз в прошлом с методами испытаний.

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

Итак, почему я должен сделать все мои методы модульного тестирования публичными?

Джастин Даринг
источник
2
Это действительно хороший вопрос. Единственный хороший аргумент, который я услышал, - это то, что он следует принципу «программа - интерфейс, а не реализация» - части принципов SOLID.
Роберт Харви
9
Я не думаю, что он говорит о тестировании своих классов, он говорит о реальных методах тестирования, которые вызываются средой тестирования.
Jtiger
1
@RobertHarvey в Java, причина для подобного ограничения (например, в JUnit) заключается в том, что разработчики фреймворка не хотят связываться с ними, setAccessibleчто может быть заблокировано каким-либо пользовательским SecurityManager
gnat
1
Вы должны принять во внимание, что это проектное решение было принято для платформы общего назначения, предназначенной для широкого использования. В таких случаях дизайнеру безопаснее предположить и подготовиться к худшему. Если это была, я не знаю, какая-то внутренняя структура компании (где можно иметь шанс гарантировать желаемую политику безопасности), или если это был какой-то инструмент узкого, специализированного назначения (например, «зритель для недоступных членов»), дизайнер будет иметь другие варианты для рассмотрения
комнат
2
@GregBurghardt Такое поведение встречается в Nunit и, вероятно, других тестовых средах, которые Microsoft не написала. Конечно, за годы, прошедшие после того, как я задал этот вопрос, я гораздо больше понимаю о .NET, но все же считаю, что это справедливый вопрос, и в комментариях есть хорошая дискуссия.
Джастин Даринг

Ответы:

2

Вы должны проверить, что делает класс, а не как он это делает.

Что касается «внешнего мира», то это то, что делает класс общедоступным; ваша среда тестирования делает то же самое.

Тестируя что-то «меньшее», чем Public, вы углубляетесь во внутреннюю реализацию класса, что является плохой идеей.

Фил В.
источник
Обратите внимание, что вопрос касается методов тестирования, а не методов в тестируемой системе. Хотя это правда, что OP утверждает, что вы можете использовать рефлексию, чтобы тестировать вещи «меньше», чем общедоступные, но это аргумент о способности каркасов тестирования обращаться к закрытым методам. Тестовая структура должна использовать отражение, чтобы найти методы тестирования (которые отмечены атрибутом), и, следовательно, должна использовать отражение, имея в виду ... "Почему мне нужно сделать все мои методы модульного тестирования общедоступными?"
Theraot
Методы тестирования имеют возможность доступа к закрытым методам; с Reflection все возможно. Я вижу этот вопрос больше о желательности этого.
Фил В.
0

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

Vetle
источник
1
Это на самом деле не отвечает на вопрос.
RubberDuck