Имитация зависимости контроллера с помощью Moq с использованием specflow

Я новичок в specflow и сомневаюсь, как издеваться над зависимостями моего контроллера. Например, у меня есть класс UserController, который зависит от моего класса UserRepository, который передает классу контроллера его конструктор. Итак, используя Moq, я делаю что-то вроде этого:

var mock = new Mock<UserRepository>();
mock.Setup(m => m.ListAll()).Returns(new List<User>());
var browser = new IE(string.Format("http://localhost:4265/{0}",
username));

Но мой контроллер не использует издевательский объект, как мне это сделать?

Спасибо


person thitemple    schedule 26.01.2011    source источник


Ответы (2)


Вы смешиваете три (как минимум) тестовых фреймворка, что, конечно, круто, но вам, вероятно, следует остановиться и подумать, что именно вы хотите протестировать.

Watin хорош для тестирования вашего пользовательского интерфейса, поскольку он управляет экземпляром браузера. Мне нравится проводить регрессионные тесты http://en.wikipedia.org/wiki/Regression_testing.

Specflow также великолепен - лично мне нравится использовать его для сокращения разрыва между разработчиками бизнеса и (нами) разработчиками программного обеспечения, поскольку мы можем фактически определять требования в терминах, которые мы оба понимаем (и, возможно, другие части организации также). Я не хочу начинать флеймовую войну, но она может создать больше проблем, чем решить, если вы не сосредоточитесь на ее реальных ценностях. Мы используем это на работе, тестируя сервисный уровень (на один уровень ниже контроллеров на уровне представления), и на самом деле мы только имитируем базу данных, внешние сервисы, файловую систему и т. д., что делает наши тесты specflow чем-то вроде интеграционных тестов.

Moq — это фиктивный фреймворк, и его, конечно, можно использовать в любых тестах (я просто проговорился, что мы это делаем), но это отличный инструмент для модульного тестирования.

Итак, возвращаясь к вашему вопросу. Если вы хотите сделать один тест, чтобы найти все свои ошибки, у вас проблемы;) Я знаю, что вы этого не хотите - это было просто глупое предложение, которое я сделал - но на самом деле, если вы просто хотите провести интеграционные тесты ( тесты, запускаемые из пользовательского интерфейса через несколько уровней/зависимостей), вы можете легко смешивать различные среды тестирования, как сейчас, но тогда зачем издеваться над пользовательским репозиторием? Это потому, что вы не хотите попадать в базу данных?

В любом случае, один из способов выполнить интеграционный тест, который вы, похоже, хотите, - это настроить ваше решение для использования макета - или, возможно, подойдет заглушка (создайте поддельный пользовательский репозиторий, который возвращает данные, которые вы хотите протестировать) - вы должны использовать Фреймворк зависимостей, такой как Unity, Ninject или карта структуры (парень, давайте не будем начинать войну о том, какой фреймворк использовать) и иметь тестовый URL-адрес, который использует Watin, запускает ваш сайт, используя конфигурацию с поддельными/фиктивными репозиториями.

С другой стороны, вы можете провести модульное тестирование своих контроллеров, служб и т. д. Возможно, вы даже захотите попробовать TDD но это совсем другая глава, которую я не могу осветить здесь!

person Per Hornshøj-Schierbeck    schedule 01.02.2011
comment
Спасибо, я понимаю, что смешивал разные типы тестирования. - person thitemple; 02.02.2011

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

Также вам нужно принять больше ответов.

person Kev Hunter    schedule 27.01.2011