Мы только что выпустили переписанный (в третий раз) модуль для нашей проприетарной системы. Этот модуль, который мы называем Load Manager, на сегодняшний день является самым сложным из всех модулей нашей системы. Мы пытаемся получить исчерпывающий набор тестов, потому что каждый раз, когда мы делаем какие-либо существенные изменения в этом модуле, есть ад, который может заплатить неделями при сортировке ошибок и причуд. Однако разработка набора тестов оказалась довольно сложной, поэтому мы ищем идеи.Нужны идеи для подхода TDD
Гитары Load Manager находятся в классе LoadManagerHandler, это по существу все логические схемы модуля. Этот обработчик требует, чтобы несколько контроллеров выполняли методы CRUD в базе данных. Эти контроллеры, по сути, являются верхним слоем DAL, который находится сверху и абстрагирует наш код, сгенерированный LLBLGen.
Так что достаточно просто издеваться над этими контроллерами, которые мы используем с использованием фрейма Moq. Однако проблема связана с сложностью диспетчера загрузки, и проблемы, которые мы получаем, касаются не простых случаев, а случаев, когда в обработчике имеется значительный объем данных.
Чтобы вкратце объяснить, менеджер загрузки содержит несколько «разгруженных» деталей, иногда в сотнях, которые затем попадают в созданные пользователем загрузочные и пустые пулы. Во время создания и заполнения этих загрузок существует множество удалений, изменений и дополнений, которые в конечном итоге могут вызывать проблемы. Тем не менее, потому что когда вы высмеивать метод объекта последних пробных побед, то есть:
jobDetailControllerMock.Setup(mock => mock.GetById(1)).Returns(jobDetail1);
jobDetailControllerMock.Setup(mock => mock.GetById(2)).Returns(jobDetail2);
jobDetailControllerMock.Setup(mock => mock.GetById(3)).Returns(jobDetail3);
Независимо от того, что я посылаю jobDetailController.GetById (х) я всегда вернусь jobDetail3. Это делает тестирование почти невозможным, потому что мы должны убедиться, что при внесении изменений все точки затронуты, что должно быть затронуто.
Итак, я решил использовать тестовую базу данных и просто разрешить чтение и запись как обычно. Однако, поскольку вы не можете (читайте: не следует) диктовать порядок ваших тестов, тесты, которые выполняются ранее, могут привести к тому, что тесты, которые будут выполняться позже, будут терпеть неудачу.
TL/DR: Я по существу ищу стратегии тестирования для ориентированного на данные кода, который является довольно сложным по своей природе.
Я поддержал ваш ответ, потому что я не знал, что это возможно, но я не верю, что полностью добьется результатов, которые я ищу. Мне нужно вернуть конкретные данные на основе используемого аргумента, и этот метод не обязательно будет вызываться в заданном порядке. Большое вам спасибо, это поможет мне в другом месте. – joshlrogers
Хорошо ... любые мысли о том, почему это не работает для меня тогда? Я использую последнюю версию Moq и независимо от того, какой аргумент я передаю, я получаю последний результат издевательства. – joshlrogers
@josh - Не знаю. Я протестировал его с v3.1.416.3, который является последней не-бета-версией с сайта. Это стандартное поведение, поэтому синтаксис It.IsAny был введен для переопределения его, когда это необходимо. Я бы посоветовал написать простейший тест с вашим контроллером и посмотреть, можете ли вы устранить переменные. Вы также можете публиковать сообщения в Moq Discussionions - они очень полезны. http://groups.google.com/group/moqdisc – TrueWill