В конструктор вводить или нет с TDD? - PullRequest
3 голосов
/ 22 января 2010

У меня есть метод, который я пытаюсь выполнить модульное тестирование, использующее объект запроса, я хотел бы оцепить этот объект запроса для моих модульных тестов Этот объект запроса имеет зависимость (UnitOfWork). Я использую контейнер IOC / DI для создания экземпляров моих объектов в приложении. Однако я не хочу использовать контейнер во время TDD. У меня есть 2 варианта:

  1. Добавьте объект запроса к классу метода в качестве поля или свойства и вставьте его в качестве аргумента ctor. Это, однако, не правильно, поскольку этот метод 1 является единственным методом который будет использовать его, и если мне когда-нибудь понадобится добавить второй метод, использующий этот объект запроса, этот объект придется повторно создавать или сбрасывать после каждого использования.
  2. Добавить объект запроса к сигнатуре метода. Запах?

Есть ли другие варианты или паттерны для этого? Или я не так подхожу?

Вот некоторый псевдокод:

Вариант № 1

public class OrdersController
{
            public OrdersController(IOrderQuery query)
            {
                this.query = query;
            }

            private readonly IOrderQuery query;

            public Queryable<Order> OrdersWaiting()
            {
                var results = query(...);
                ...
            }
}

Вариант № 2

public class OrdersController
{
            public Queryable<Order> OrdersWaiting(IOrderQuery query)
            {
                var results = query(...);
                ...
            }
}

И мой объект запроса

public class OrderQuery : IOrderQuery
{
            public OrderQuery(IUnitOfWork unitOfWork)
            {
                ...
            }
}

Ответы [ 2 ]

1 голос
/ 22 января 2010

если бы мне пришлось добавить секунду метод, который использовал этот объект запроса, объект должен быть восстановлен или сброшен после каждого использовать.

Если это то, что мешает вам использовать инжектор конструктора, рассмотрите возможность введения IOrderQueryFactory.

1 голос
/ 22 января 2010

Определенно предпочтительнее вариант 1, а не вариант 2. Похоже, что контейнер IOC отвечает за создание экземпляра / знание объекта запроса. Вызывающая сторона не должна знать детали того, как / откуда OrdersWaiting получает свои данные.

При использовании опции 2 не только вызывающему абоненту требуется получить экземпляр контроллера, но и экземпляру объекта запроса, который, вероятно, должен быть за пределами видимости вызывающего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...