@PickGG

Как тестировать методы работающие с приватными или защищенными полями?

Есть такой простой код.

class Worker { }

    interface IOffice
    {
        void AddWorker(Worker worker);
        Worker[] GetWorkers();
    }

    class Office : IOffice
    {
        private List<Worker> _workers;

        public Office()
        {
            _workers = new List<Worker>();
        }

        public void AddWorker(Worker worker)
        {
            _workers.Add(worker);
        }

        public Worker[] GetWorkers()
        {
            return _workers.ToArray();
        }


Как протестировать метод AddWorker на добавление элементов? Чтобы это сделать мне нужно в тесте получить список Worker'ов.

Какой вариант выбрать?
  1. Через вызов GetWorkers не пойдет я буду тестировать сразу два метода - это плохо.
  2. Если сделаю поле _workers как internal тогда нарушится инкапсуляция
  3. Получить поле через рефлексию
  4. Может есть вариант получше?
  • Вопрос задан
  • 338 просмотров
Пригласить эксперта
Ответы на вопрос 3
@kttotto
пофиг на чем писать
1. Не верно. Вы будете использовать GetWorkers, но тестировать AddWorker. На GetWorkers можете написать отдельный тест.

PS: Тестировать приватные поля плохая практика. Тестировать нужно ожидаемое поведение доступного из вне метода, т.е. публичные. Тестировать внутреннюю реализацию не нужно, нужно тестировать то, что она даст на выходе.
Ответ написан
Комментировать
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
Не стоит использовать CLR, C# и компьютер.
Вы должны использовать только AddWorker.
Делайте это на бумаге. Авторучкой. С чернильницей.
Ответ написан
Комментировать
Да в любом тесте мне понадобится поле _workers. Как его получать?

Никак. Если говорить по хорошему, этот код невозможно протестировать. Поэтому, например, при TDD не используются статичные классы. Разработка через тестирование заставляет в первую очередь думать что пишешь. Зачем нужна обертка вокруг в виде класса Office вокруг класса List? Какие задачи она решает? Почему в том месте, где будет использоваться интерфейс IOffice не использовать просто класс List? Когда начинаешь задумываться над такими вещами, тогда отпадает надобность получать доступ к приватным полям.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы