Asp.Net MVC2单元测试控制器:请求[“选择”]

时间:2011-05-11 19:29:00

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

我是单位测试的新手,并试图学习TDD,但我无法弄清楚 如何测试这个。我已经花了两天时间(不要担心它不是 对于雇主,所以请不要聪明的答案。)

我写了一个我要测试的控制器,我需要为其分配一个值 “选择”。简化,它看起来像这样:

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

如何在测试中为“选择”指定值,还是我?在申请中, “选择”的值由页面视图中表单中的单选按钮分配。 这是我在psuedocode中的测试:

    [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);
    }

谢谢, 马里奥

3 个答案:

答案 0 :(得分:4)

我很确定你可以接受选择作为你的动作方法的参数。然后不需要恶作剧:

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

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

答案 1 :(得分:1)

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

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

示例:

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 */);
}

答案 2 :(得分:1)

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

但是如果你需要更多的东西并伪造HTTP的东西,你应该看看MvcContrib TestHelpers;他们会帮你测试很多东西。