Ну, у вас есть 2 варианта:
- Используйте отражение или классы закрытого доступа MSTest для получения и установки значений закрытого поля во время теста.
- Просто не беспокойтесь об этоми протестируйте открытое поведение, даже если это означает, что ваш тест зависит от других свойств или метода, которые тестируются в другом месте.
Как вы, вероятно, можете сказать из формулировки, мой выбор будет с # 2 -Вы должны проверить выставленное поведение .В вашем случае тестируемое поведение, которое вы тестируете:
- Если я использую
AddComponent
, то добавленный компонент должен быть доступен через индексатор - Если я использую индексатор, ядолжен иметь возможность доступа к любым компонентам, которые были добавлены с помощью
AddComponent
. В этом случае совершенно очевидно, что это почти одно и то же, поэтому у нас действительно только один случай блока / открытое поведение дляпроверить здесь.Да, этот модульный тест охватывает две разные вещи, но это не должно иметь большого значения - мы не пытаемся проверить, что каждый метод / свойство ведет себя так, как ожидалось, скорее мы хотим проверить, что каждое уязвимое поведение работает, как ожидалось.
В качестве альтернативы предположим, что мы выбрали вариант 1 и использовали личное отражение, чтобы сами проверить состояние _components
.В этом случае bevahour, который мы на самом деле тестируем:
- Если я использую
AddComponent
, то добавленный компонент должен быть добавлен к _components
- Если я использую индексатор,Я должен иметь возможность доступа к любым компонентам, которые находятся в
_components
. Мы не только теперь тестируем внутреннее поведение класса (так что, если реализация изменится, тесты не пройдут, даже если классработает как положено), но мы только удвоили количество тестов, которые мы пишем.
Кроме того, увеличивая сложность наших тестов, мы увеличиваем вероятность того, что сами тесты есть ошибка - например, что если мы допустили ошибку, а в тесте 2. мы проверили какое-то совершенно другое закрытое поле?В этом случае мы не только сделали больше для себя, но даже не тестируем то поведение, которое хотим протестировать!