Пересмешиваем класс RouteData в System.Web.Routing для приложений MVC - PullRequest
31 голосов
/ 12 июня 2009

Я пытаюсь проверить некоторую логику приложения, которая зависит от свойства 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: Invalid установка на не переопределение члена: г => r.Values ​​

Создание фиктивных RouteData также не работает, так как конструктором является RouteData (RouteBase, IRouteHandler).

Важным классом здесь является абстрактный класс RouteBase, который имеет метод GetRouteData (HttpContextBase), который возвращает экземпляр RouteData, класса, который я пытаюсь подделать. Возьми меня по кругу!

Любая помощь по этому вопросу будет приветствоваться.

Ответы [ 2 ]

61 голосов
/ 12 июня 2009

RouteData также имеет конструктор , который не принимает аргументов . Просто создайте его и добавьте в него значения, которые вы хотите. Не нужно издеваться над ним, когда вы можете его создать.

 var routeData = new RouteData();
 routeData.Values.Add( "key1", "value1" );

 var controllerContext = new ControllerContext(httpContextMock.Object, routeData, controllerMock.Object);
1 голос
/ 12 июня 2009

Я очень новичок в TDD в связи с фиктивными объектами, но урок, который я рано усвоил у коллеги, не состоял в том, чтобы издеваться над типами, которыми вы не владеете. Таким образом, не пытайтесь издеваться над RouteData. Идея была первоначально задумана Джо Уолнесом (хотя я не могу найти, где он это сказал).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...