Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在System.Web.Routing for MVC应用程序中模拟RoutedData类_C#_Asp.net Mvc_Moq - Fatal编程技术网

C# 在System.Web.Routing for MVC应用程序中模拟RoutedData类

C# 在System.Web.Routing for MVC应用程序中模拟RoutedData类,c#,asp.net-mvc,moq,C#,Asp.net Mvc,Moq,我试图测试一些依赖于ControllerContext.RouteData中的Values属性的应用程序逻辑 到目前为止我有 // Arrange var httpContextMock = new Mock<HttpContextBase>(MockBehavior.Loose); var controllerMock = new Mock<ControllerBase>(MockBehavior.Loose); var routeDataMock = new Mock

我试图测试一些依赖于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);
//排列
var httpContextMock=newmock(MockBehavior.Loose);
var controllerMock=新模拟(MockBehavior.Loose);
var routeDataMock=new Mock();
var wantedRouteValues=新字典();
wantedRouteValues.Add(“键1”、“值1”);
var routeValues=新的RouteValueDictionary(wantedRouteValues);
SetupGet(r=>r.Values).返回(routeValue);r.价值观

创建假RouteData也不起作用,因为构造函数是RouteData(RouteBase,IRouteHandler)

这里重要的类是抽象类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。这个想法最初是由(尽管我找不到他在哪里说的)。

哈哈,谢谢。这是我对这个问题考虑过度的一个例子。很简单。干杯。事实上,微软开发HttpContextBase的原因之一就是为了让你可以嘲笑它。这是一个非常复杂的对象,但在web测试中经常使用。在Steven Sanderson的Pro ASP.NET MVC 2中有一些使用Moq测试路由的优秀示例。那么,如何支持我测试依赖于RoutedData之类内容的助手呢。。如果你说我不应该模仿我不拥有的课程?测试无法编写,或者我正在测试的类可能需要更抽象的方式?现在不必麻烦换我的课了。。它是有效的,我只需要单元测试来证明它:DIf如果你不模仿那些你不拥有的类型,另一种选择是实例化它们——这实际上意味着你的测试覆盖了它们。您肯定不应该测试您不拥有的类型,那么有什么替代方案呢?