Отказывание класса 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);
Сбой unit test:
System.ArgumentException: Invalid установка на не переопределение члена:
г = > r.Values
Создание фальшивой RouteData не работает либо в качестве конструктора RouteData (RouteBase, IRouteHandler).
Важным классом здесь является абстрактный класс RouteBase, который имеет метод GetRouteData (HttpContextBase), который возвращает экземпляр RouteData, класс, который я пытаюсь подделать. Принимая меня кругами!
Любая помощь по этому поводу будет приветствоваться.
Ответы
Ответ 1
В RouteData также есть конструктор который не принимает аргументов. Просто создайте его и добавьте нужные ему значения. Не нужно издеваться над ним, когда вы можете его создать.
var routeData = new RouteData();
routeData.Values.Add( "key1", "value1" );
var controllerContext = new ControllerContext(httpContextMock.Object, routeData, controllerMock.Object);
Ответ 2
Я очень новичок в TDD в сочетании с макетными объектами, но урок, который я узнал на ранней стадии от коллеги, заключался не в том, чтобы издеваться над типами, которыми вы не владеете. Таким образом, не пытайтесь издеваться над RouteData. Идея изначально была задумана Joe Walnes (хотя я не могу найти, где он это сказал).