Модульное тестирование унаследованного кода - что нужно изменить, чтобы соответствовать контекстам Rhino Mocks - PullRequest
1 голос
/ 22 декабря 2010

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

Код, о котором идет речь, - это контроллер MVC.Я переработал его, чтобы удалить прямые зависимости, и заменил их интерфейсами, которые были хорошими и понятными.Однако у меня возникают реальные проблемы с корректной корректировкой всех контекстных макетов, чтобы выполнить тестирование.

Большая часть кода выполняет вызовы как Request.QueryString, так и Request.Params.Я не совсем уверен, почему он рассматривает два отдельно, но мне не хочется возиться с чем-то, что мне на самом деле не нужно , чтобы измениться.

Так что я собрал это для инициализациипроверяемый контекст:

        var controller = new TestController();

        var request = MockRepository.GenerateMock<HttpRequestBase>();
        var context = MockRepository.GenerateMock<HttpContextBase>();

        var collection = new System.Collections.Specialized.NameValueCollection();   
        collection.Add("Id", "1");   

        context.Expect( c => c.Request ).Return( request ).Repeat.Any();
        request.Expect( r => r.Params ).Return( collection ).Repeat.Any();
        request.Expect( x => x.QueryString["foo"] ).Return("bar").Repeat.Any();

        controller.ControllerContext = new ControllerContext(context, new RouteData(), controller);

"TestController" - это просто локальный класс, который наследуется от тестируемого контроллера.Приведенный выше код компилируется довольно счастливо, но когда я пытаюсь запустить его, я получаю следующую ошибку:

 Previous method 'HttpRequestBase.get_QueryString();' requires a return value or an exception to throw.

Поиск в Google, кажется, не очень полезен.

Вопрос в том, что делатьЯ реорганизую здесь: мой тест, чтобы попытаться заставить его построить, или мой базовый код, чтобы он просто использовал Params или QueryString, но не оба?

Cheers, Matt

1 Ответ

0 голосов
/ 30 декабря 2010

Это не отвечает на ваш вопрос напрямую, но я думаю, что вы должны попробовать использовать MVC Contrib TestControllerBuilder для этого вида тестирования. Он имеет дело с множеством зависимостей контроллера и позволяет вам сконцентрироваться на тех битах, которые необходимо протестировать.

...