RhinoMocks тестирует сервис
Я использую Sharp Architechture и Rhino Mocks с NUnit.
У меня есть тестовый сервис, который выглядит так
public class TestService : ITestService {
public TestService(ITestQueries testQueries, IRepository<Test> testRepository,
IApplicationCachedListService applicationCachedListService) {
Check.Require(testQueries != null, "testQueries may not be null");
Check.Require(applicationCachedListService != null, "applicationCachedListService may not be null");
_testQueries = testQueries;
_testRepository = testRepository;
_applicationCachedListService = applicationCachedListService;
}
Затем у меня есть этот метод в моем сервисе
public string Create(TestFormViewModel viewModel, ViewDataDictionary viewData, TempDataDictionary tempData) {
if (!viewData.ModelState.IsValid) {
tempData.SafeAdd(viewModel);
return "Create";
}
try {
var test = new Test();
UpdateFromViewModel(test, viewModel);
_testRepository.SaveOrUpdate(test);
tempData[ControllerEnums.GlobalViewDataProperty.PageMessage.ToString()]
= string.Format("Successfully created product '{0}'", test.TestName);
}
catch (Exception ex) {
_testRepository.DbContext.RollbackTransaction();
tempData[ControllerEnums.GlobalViewDataProperty.PageMessage.ToString()]
= string.Format("An error occurred creating the product: {0}", ex.Message);
return "Create";
}
return "Index";
}
}
Затем у меня есть контроллер, который выглядит так:
[ValidateAntiForgeryToken]
[Transaction]
[AcceptVerbs(HttpVerbs.Post)]
[ModelStateToTempData]
public ActionResult Create(TestFormViewModel viewModel) {
return RedirectToAction(_testService.Create(viewModel, ViewData, TempData));
}
Я хочу написать простой тест, чтобы увидеть, если когда! ViewData.ModelState.IsValid я верну "Создать".
У меня пока есть это, но я запутался, потому что он на самом деле не тестирует контроллер, а просто делает то, что я говорю, делать в ответ.
[Test]
public void CreateResult_RedirectsToActionCreate_WhenModelStateIsInvalid(){
// Arrange
var viewModel = new TestFormViewModel();
_controller.ViewData.ModelState.Clear();
_controller.ModelState.AddModelError("Name", "Please enter a name");
_testService.Stub(a => a.Create(viewModel, new ViewDataDictionary(), new TempDataDictionary())).IgnoreArguments().Return("Create");
// Act
var result = _controller.Create(viewModel);
// Assert
result.AssertActionRedirect().ToAction("Create"); //this is really not testing the controller??.
}
Любая помощь приветствуется.
1 ответ
Похоже, вы пытаетесь писать не юнит-тесты. Это больше похоже на интеграционный тест. Следуя идеологии модульного тестирования, у вас есть две единицы: Service
а также Controller
, Идея состоит в том, что вы должны тестировать каждый модуль отдельно и делать ваши тесты простыми В соответствии с этим, прежде всего, вы должны написать тесты для TestService
, После этого, когда вы это осветите, напишите тесты для своего Controller
используя Stubs/Mocks для TestService
, Итак, ваш тест на Controller
выглядит правильно, он проверяет, что перенаправление происходит в соответствии с результатом от Service.Create
метод. Вы должны добавить тесты для вашего TestService
без контекста контроллера, и он имеет хорошее покрытие. Если вы хотите протестировать эти модули вместе, вы не должны использовать макеты, и это будет больше похоже на интеграционные тесты. Кроме того, чтобы охватить интеграцию между модулями, вы можете написать веб-тесты, используя некоторые инструменты, такие как WatiN или Selenium, для тестирования всего приложения. Но в любом случае писать юнит-тесты для отдельных частей - это хорошая практика.