我是单位测试的新手,并试图学习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);
}
谢谢, 马里奥
答案 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;他们会帮你测试很多东西。