Пересмешивание класса RouteData в System.Web.Routing для приложений MVC
Я пытаюсь проверить некоторую логику приложения, которая зависит от свойства Values в ControllerContext.RouteData.
Пока у меня есть
// Arrange
var httpContextMock = new Mock<HttpContextBase>(MockBehavior.Loose);
var controllerMock = new Mock<ControllerBase>(MockBehavior.Loose);
var routeDataMock = new Mock<RouteData>();
var wantedRouteValues = new Dictionary<string, string>();
wantedRouteValues.Add("key1", "value1");
var routeValues = new RouteValueDictionary(wantedRouteValues);
routeDataMock.SetupGet(r => r.Values).Returns(routeValues); <=== Fails here
var controllerContext = new ControllerContext(httpContextMock.Object, routeDataMock.Object, controllerMock.Object);
Модульный тест завершается неудачно с: System.ArgumentException: Неверная настройка для не перезаписываемого элемента: r => r.Values
Создание поддельных RouteData также не работает, так как конструктор - RouteData(RouteBase,IRouteHandler).
Важным классом здесь является абстрактный класс RouteBase, который имеет метод GetRouteData(HttpContextBase), который возвращает экземпляр RouteData, класса, который я пытаюсь подделать. Возьми меня по кругу!
Любая помощь по этому вопросу будет приветствоваться.
2 ответа
RouteData также имеет конструктор, который не принимает аргументов. Просто создайте его и добавьте в него значения, которые вы хотите. Не нужно издеваться над ним, когда вы можете его создать.
var routeData = new RouteData();
routeData.Values.Add( "key1", "value1" );
var controllerContext = new ControllerContext(httpContextMock.Object, routeData, controllerMock.Object);
Я очень плохо знаком с TDD в связи с фиктивными объектами, но урок, который я рано усвоил у коллеги, не состоял в том, чтобы издеваться над типами, которыми вы не владеете. Таким образом, не пытайтесь издеваться над RouteData. Идея была изначально задумана Джо Уолнесом (хотя я не могу найти, где он это сказал).