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