在System.Web.Routing中为MVC应用程序模拟RouteData类

我正在尝试测试一些依赖于ControllerContext.RouteData中的Values属性的应用程序逻辑。

到目前为止我有

// Arrange var httpContextMock = new Mock(MockBehavior.Loose); var controllerMock = new Mock(MockBehavior.Loose); var routeDataMock = new Mock(); var wantedRouteValues = new Dictionary(); 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 testing失败:System.ArgumentException:不可覆盖的成员上的设置无效:r => r.Values

由于构造函数是RouteData(RouteBase,IRouteHandler),因此创建伪造的RouteData也不起作用。

这里重要的类是抽象类RouteBase,它有GetRouteData(HttpContextBase)方法,它返回一个RouteData实例,我试图伪造的类。 把我带到圈子里!

对此有任何帮助将是最受欢迎的。

RouteData还有一个不带参数的构造函数 。 只需创建一个并将值添加到您想要的值。 当你可以创建一个时,无需模拟它。

  var routeData = new RouteData(); routeData.Values.Add( "key1", "value1" ); var controllerContext = new ControllerContext(httpContextMock.Object, routeData, controllerMock.Object); 

我对TDD和模拟对象都很陌生,但是我从同事那里学到的一个教训就是不要嘲笑你不拥有的类型。 因此,不要试图模拟RouteData。 这个想法最初是由Joe Walnes构思的(虽然我找不到他说的地方)。