我正在尝试测试一些依赖于ControllerContext.RouteData中的Values属性的应用程序逻辑。
到目前为止我已经
了// 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 =&GT; r.Values
创建假的RouteData不起作用,因为构造函数是RouteData(RouteBase,IRouteHandler)。
这里重要的类是抽象类RouteBase,它有GetRouteData(HttpContextBase)方法,它返回一个RouteData实例,我试图伪造的类。把我带到圈内!
对此的任何帮助都是最受欢迎的。
答案 0 :(得分:61)
RouteData也有一个constructor that takes no arguments。只需创建一个并将值添加到您想要的值。当你可以创建一个时,不需要嘲笑它。
var routeData = new RouteData();
routeData.Values.Add( "key1", "value1" );
var controllerContext = new ControllerContext(httpContextMock.Object, routeData, controllerMock.Object);
答案 1 :(得分:1)
我对TDD和模拟对象都很陌生,但我从同事那里学到的一课不是模拟你不拥有的类型。因此,不要试图模拟RouteData。这个想法最初由Joe Walnes构思(虽然我找不到他说的地方)。