@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. Может есть вариант получше?
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 4
@kttotto
все, что .NET
1. Не верно. Вы будете использовать GetWorkers, но тестировать AddWorker. На GetWorkers можете написать отдельный тест.

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

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

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

Войти через TM ID
Похожие вопросы
17 авг. 2018, в 17:10
15000 руб./за проект
17 авг. 2018, в 16:58
60000 руб./за проект
17 авг. 2018, в 16:55
10000 руб./за проект