Отказывание класса 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 (хотя я не могу найти, где он это сказал).