Asp.net mvc Asp.Net MVC2单元测试控制器:请求[“选择”]
我不熟悉单元测试并尝试学习TDD,但我无法理解 如何测试这个。我已经花了两天的时间(别担心,不是的) 对于雇主而言,请不要给出聪明的答案) 我写了一个我想测试的控制器,我需要给它赋值 “选择”。简而言之,它看起来是这样的: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
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,我没有开发请求,也不需要测试请求。