【问题标题】:Asp.Net MVC2 Unit Test Controller: Request["Choice"]Asp.Net MVC2 单元测试控制器:请求[“选择”]
【发布时间】:2011-08-23 14:18:02
【问题描述】:

我是单元测试的新手,正在尝试学习 TDD,但我不知道 如何测试这个。我已经花了两天时间(不用担心它不是 对于雇主,所以请不要聪明的答案)。

我写了一个想要测试的控制器,我需要给它赋值 “选择”。简化后如下所示:

    public ActionResult Index()
    {
          string s = Request["Choice"];
          return View(new MyList.GetList(s));
    }

我如何在测试中为“选择”分配一个值,或者我可以吗?在申请中, “Choice”的值由页面视图中表单中的单选按钮分配。 这是我在伪代码中的测试:

    [TestMethod()]
    public void IndexTest()
    {
          CategoryController target = new CategoryController();
          var result = target.Index() as ViewResult;
          MyList actual = result.ViewData.Model as MyList;

          // etc ...

          Assert.AreEqual(expected.List, actual.List);
    }

谢谢, 马里奥

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-3


    【解决方案1】:

    基本上你不想测试 Request 是否正常工作。

    请求不是您开发的,因此您可以通过包装将其从测试中排除。

    例子:

    public ActionResult Index()
    {
        string s = GetChoice();
        return View(new MyList.GetList(s));
    }
    
    public virtual string GetChoice()
    {
        return Request["Choice"];
    }
    

    然后你可以在你的单元测试中伪造 GetChoice 方法。

    您的测试可能如下所示:

    public void Index_WhenCalled_ReturnsMyListFromChoice()
    {
        var fake = MockRepository.GenerateStub<SomeController>();
        fake.Expect(x => x.GetChoice()).Return("some fake choice");
    
        var returnedView = fake.Index();
    
        Assert(/*assert something here */);
    }
    

    【讨论】:

    • 你说得对 Joseph,我没有开发 Request,也不需要测试 Request。
    【解决方案2】:

    我很确定您可以接受选择作为您的操作方法的参数。那么就不需要恶作剧了:

    public ActionResult Index(string choice)
    {
          return View(new MyList.GetList(choice));
    }
    

    如果选择来自 cookie 或服务器变量,这将不起作用,但我假设您期望它来自查询字符串或表单帖子。

    【讨论】:

    • +1。以这种方式使用 Request 对于 ASP.NET MVC 来说是相当“低级”的。让模型绑定器为您完成这项工作。
    • 抱歉,这不起作用。我已经试过了。我的第一次点击没有参数。
    • 如果“我的第一次命中”是指初始 GET 请求不包含 POST 编辑的选择参数,那么该方法仍应执行,只是选择变量中的值为空。您的方法应该能够处理这种情况。或者,您可以为 [HttpGet] 和 [HttpPost] 创建单独的方法来处理差异。
    • 我有一个 [HttpGet] 和一个 [HttpPost] 方法。我正在测试 GET 方法。有两种情况,Index() 是在没有参数的情况下调用的。在该方法中,调用 Request["Choice"]。当Actionlink调用该方法时,Request["Choice]返回一个null,没关系。这是正确的用法。但是当View Form被提交时,"Choice"是有值的。
    • 很抱歉,如果没有扩展的代码示例,我不确定我是否能了解正在发生的事情。我仍然认为你可以使用动作参数来完成这项工作,但需要看看你想要做什么才能弄清楚如何提供帮助:-)
    【解决方案3】:

    如前所述,强类型操作方法是您的朋友,请使用它们。

    但是,如果您需要大量伪造 HTTP 的东西,您应该查看MvcContrib TestHelpers;他们会帮助你测试很多这样的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      相关资源
      最近更新 更多