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

Asp.net mvc Asp.Net MVC2单元测试控制器:请求[“选择”],asp.net-mvc,asp.net-mvc-2,asp.net-mvc-3,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)); } public

我不熟悉单元测试并尝试学习TDD,但我无法理解 如何测试这个。我已经花了两天的时间(别担心,不是的) 对于雇主而言,请不要给出聪明的答案)

我写了一个我想测试的控制器,我需要给它赋值 “选择”。简而言之,它看起来是这样的:

    public ActionResult Index()
    {
          string s = Request["Choice"];
          return View(new MyList.GetList(s));
    }
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 */);
}
我如何在测试中为“选择”赋值,或者我可以吗?在申请中, “选择”的值由页面视图中表单中的单选按钮指定。 这是我在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);
    }
谢谢,
Mario

基本上,您不想测试该请求是否正常工作

请求是您没有开发的东西,所以您可以通过包装它将其从测试中排除

例如:

public ActionResult Index()
{
    string s = GetChoice();
    return View(new MyList.GetList(s));
}

public virtual string GetChoice()
{
    return Request["Choice"];
}
然后,您可以在单元测试中伪造GetChoice方法

您的测试可能如下所示:

    public ActionResult Index()
    {
          string s = Request["Choice"];
          return View(new MyList.GetList(s));
    }
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 */);
}
public void Index_when called_returnsMyList fromChoice()
{
var fake=MockRepository.GenerateStub();
Expect(x=>x.GetChoice()).Return(“一些假选择”);
var returnedView=false.Index();
断言(/*在这里断言某物*/);
}

基本上,您不想测试该请求是否正常工作

请求是您没有开发的东西,所以您可以通过包装它将其从测试中排除

例如:

public ActionResult Index()
{
    string s = GetChoice();
    return View(new MyList.GetList(s));
}

public virtual string GetChoice()
{
    return Request["Choice"];
}
然后,您可以在单元测试中伪造GetChoice方法

您的测试可能如下所示:

    public ActionResult Index()
    {
          string s = Request["Choice"];
          return View(new MyList.GetList(s));
    }
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 */);
}
public void Index_when called_returnsMyList fromChoice()
{
var fake=MockRepository.GenerateStub();
Expect(x=>x.GetChoice()).Return(“一些假选择”);
var returnedView=false.Index();
断言(/*在这里断言某物*/);
}

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

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

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

我很确定您可以接受choice作为操作方法的参数。那么就不需要耍花招了:

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

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

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


但是,如果你需要大量使用和伪造HTTP内容,你应该检查一下;它们将帮助你测试很多这类东西。

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


但是,如果你需要大量使用和伪造HTTP内容,你应该检查一下;他们会帮你测试很多这种东西。

+1。以这种方式使用
Request
对于ASP.NET MVC来说是相当“低级的”。让模型活页夹为你做这项工作。对不起,这不起作用。我已经试过了。我的第一次命中没有参数。如果“我的第一次命中”指的是不包含POST ed choice参数的初始GET请求,则该方法仍应执行,只是choice变量中有一个空值。您的方法应该能够处理这种情况。或者,您可以为[HttpGet]和[HttpPost]创建单独的方法来处理差异。我正在测试GET方法。有两种情况,在没有参数的情况下调用Index()。在方法中,调用请求[“Choice”]。当Actionlink调用该方法时,Request[“Choice]返回空值,这没关系。这是一种正确的用法。但是当提交视图表单时,“Choice”“有一个值。很抱歉,如果没有扩展的代码示例,我不确定我是否能够得到正在发生的事情。我仍然认为,您可以使用操作参数来实现这一点,但需要了解您正在尝试做什么,以便了解如何帮助:-)+1。以这种方式使用
Request
对于ASP.NET MVC来说是相当“低级的”。让模型活页夹为你做这项工作。对不起,这不起作用。我已经试过了。我的第一次命中没有参数。如果“我的第一次命中”指的是不包含POST ed choice参数的初始GET请求,则该方法仍应执行,只是choice变量中有一个空值。您的方法应该能够处理这种情况。或者,您可以为[HttpGet]和[HttpPost]创建单独的方法来处理差异。我正在测试GET方法。有两种情况,在没有参数的情况下调用Index()。在方法中,调用请求[“Choice”]。当Actionlink调用该方法时,Request[“Choice]返回空值,这没关系。这是一种正确的用法。但是当提交视图表单时,“Choice”“有一个值。很抱歉,如果没有扩展的代码示例,我不确定我是否能够得到正在发生的事情。我仍然认为您可以通过操作参数来实现这一点,但需要了解您正在尝试做什么,以便找出如何提供帮助:-)您是对的Joseph,我没有开发请求,也不需要测试请求。您是对的Joseph,我没有开发请求,也不需要测试请求。