Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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# 返回字符串时URL帮助程序方法测试失败_C#_Asp.net Mvc_Asp.net Mvc 2_Nunit - Fatal编程技术网

C# 返回字符串时URL帮助程序方法测试失败

C# 返回字符串时URL帮助程序方法测试失败,c#,asp.net-mvc,asp.net-mvc-2,nunit,C#,Asp.net Mvc,Asp.net Mvc 2,Nunit,我使用的是ASP.netmvc3和NUnit 我创建了一个helper方法来返回动作方法(重载方法): 失败的测试是第二个名为CategoryIndex\u的测试,它应该使用\u child\u category\u id()导航到\u category\u index\u action\u method\u 私有HttpContextBase HttpContextBaseSub; 私有请求上下文请求上下文; 私人UrlHelper UrlHelper; [设置] 公共作废设置() { htt

我使用的是
ASP.netmvc3
NUnit

我创建了一个helper方法来返回动作方法(重载方法):

失败的测试是第二个名为
CategoryIndex\u的测试,它应该使用\u child\u category\u id()导航到\u category\u index\u action\u method\u

私有HttpContextBase HttpContextBaseSub;
私有请求上下文请求上下文;
私人UrlHelper UrlHelper;
[设置]
公共作废设置()
{
httpContextBaseStub=MockRepository.GenerateSub();
requestContext=newrequestcontext(httpContextBaseStub,newroutedata());
urlHelper=新的urlHelper(requestContext);
}
[测试]
公共无效类别索引应导航到类别索引方法()
{
//表演
object actual=UrlHelperNavigationExtensions.CategoryIndex(urlHelper);
//断言
RouteValueDictionary routes=新的RouteValueDictionary(实际);
Assert.AreEqual(“类别”,路由[“控制器]);
AreEqual(“索引”,路由[“操作]);
}
[测试]
public void CategoryIndex应导航到具有子类别id()的类别索引方法
{
//安排
int childCategoryId=1;
//表演
string actual=UrlHelperNavigationExtensions.CategoryIndex(urlHelper,childCategoryId);
//断言
Assert.AreEqual(“/Category/Index/1”,实际值);
}

它抱怨实际值为空。为什么会这样?我该如何纠正它?

我的猜测是因为路由表是空的,所以它不知道如何生成url

添加普通/{controller}/{action}路由,它应该可以工作

(我在打电话,如果这是错误的,请原谅)

您需要存根一个IRouteHandler实现,我在这里称之为存根处理程序

RouteTable.Routes.Add(new Route
(
     "{controller}/{action}/{id}"
     , stub_handler
);

在我看来,您没有初始化routecollection。我想这样的事情就行了

[SetUp]
public void SetUp()
{
   RouteCollection routes = new RouteCollection();
   MvcApplication.RegisterRoutes(routes);

   httpContextBaseStub = MockRepository.GenerateStub<HttpContextBase>();
   requestContext = new RequestContext(httpContextBaseStub, new RouteData());

   //urlHelper = new UrlHelper(requestContext);
   urlHelper = new UrlHelper(requestContext, routes);
}
[设置]
公共作废设置()
{
RouteCollection routes=新RouteCollection();
MVCAPApplication.RegisterRoutes(路由);
httpContextBaseStub=MockRepository.GenerateSub();
requestContext=newrequestcontext(httpContextBaseStub,newroutedata());
//urlHelper=新的urlHelper(requestContext);
urlHelper=新的urlHelper(请求上下文、路由);
}
似乎还没有设置HttpContextBase。请确保对其进行适当的模拟,否则您将得到一些空引用异常

[SetUp]
public void SetUp()
{
  RouteCollection routes = new RouteCollection();
  MvcApplication.RegisterRoutes(routes);

  //httpContextBaseStub = (new Moq.Mock<HttpContextBase>()).Object;

  var request = new Mock<HttpRequestBase>();
  var response = new Mock<HttpResponseBase>();
  response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns((String url) => url);
  var mockHttpContext = new Mock<HttpContextBase>();
  mockHttpContext.Setup(c => c.Request).Returns(request.Object);
  mockHttpContext.Setup(c => c.Response).Returns(response.Object);
  requestContext = new RequestContext(mockHttpContext.Object, new RouteData());

  urlHelper = new UrlHelper(requestContext, routes);
}
[设置]
公共作废设置()
{
RouteCollection routes=新RouteCollection();
MVCAPApplication.RegisterRoutes(路由);
//httpContextBaseStub=(新的Moq.Mock()).Object;
var request=newmock();
var response=newmock();
response.Setup(r=>r.ApplyAppPathModifier(It.IsAny())。返回((字符串url)=>url);
var mockHttpContext=new Mock();
mockHttpContext.Setup(c=>c.Request).Returns(Request.Object);
mockHttpContext.Setup(c=>c.Response).Returns(Response.Object);
requestContext=newRequestContext(mockHttpContext.Object,newRoutedData());
urlHelper=新的urlHelper(请求上下文、路由);
}

您可以发布与此相关的路由规则吗?@Iridio:添加新项目时,我有默认规则。@Brendan,更新后,您必须对IRoutHandler接口执行更多存根操作。
[SetUp]
public void SetUp()
{
   RouteCollection routes = new RouteCollection();
   MvcApplication.RegisterRoutes(routes);

   httpContextBaseStub = MockRepository.GenerateStub<HttpContextBase>();
   requestContext = new RequestContext(httpContextBaseStub, new RouteData());

   //urlHelper = new UrlHelper(requestContext);
   urlHelper = new UrlHelper(requestContext, routes);
}
[SetUp]
public void SetUp()
{
  RouteCollection routes = new RouteCollection();
  MvcApplication.RegisterRoutes(routes);

  //httpContextBaseStub = (new Moq.Mock<HttpContextBase>()).Object;

  var request = new Mock<HttpRequestBase>();
  var response = new Mock<HttpResponseBase>();
  response.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())).Returns((String url) => url);
  var mockHttpContext = new Mock<HttpContextBase>();
  mockHttpContext.Setup(c => c.Request).Returns(request.Object);
  mockHttpContext.Setup(c => c.Response).Returns(response.Object);
  requestContext = new RequestContext(mockHttpContext.Object, new RouteData());

  urlHelper = new UrlHelper(requestContext, routes);
}