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 я возвращаю «Create».

У меня это пока есть, но я смущен, потому что на самом деле он не тестирует контроллер, а просто делает то, что я говорю ему делать в ответ.

[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??.



    }

Любая помощь приветствуется.


person TheCodeFool    schedule 11.09.2012    source источник


Ответы (1)


Похоже, вы пытаетесь писать не Unit-тесты. Это больше похоже на интеграционный тест. Следуя идеологии модульного тестирования, у вас есть два модуля: Service и Controller. Идея состоит в том, что вы должны тестировать каждый модуль отдельно и делать тесты простыми. В соответствии с этим в первую очередь следует написать тесты для TestService. После этого, когда вы его закроете, напишите тесты для своего Controller, используя заглушки / макеты для TestService. Итак, ваш тест на Controller выглядит правильно, он проверяет, что перенаправление происходит в соответствии с результатом метода Service.Create. Вы должны добавить тесты для своего TestService без контекста контроллера, и он будет хорошо охвачен. Если вы хотите протестировать эти модули вместе, вы не должны использовать имитацию, и это будет больше похоже на интеграционные тесты. Помимо интеграции между модулями, вы можете писать веб-тесты, используя некоторые инструменты, такие как WatiN или Selenium, для тестирования всего приложения. Но в любом случае писать модульные тесты для отдельных частей - это хорошая практика.

person Pavel Bakshy    schedule 11.09.2012