我有一个控制器,在一个实体上实现一个简单的添加操作,并重定向到“详细信息”页面:
[HttpPost] public ActionResult Add(Thing thing) { // ... do validation,db stuff ... return this.RedirectToAction<c => c.Details(thing.Id)); }
这很好用(使用MvcContrib程序集的RedirectToAction)。
当我单元测试这个方法,我想访问从Details操作返回的ViewData(所以我可以得到新插入的东西的主键,并证明它现在在数据库中)。
测试有:
var result = controller.Add(thing);
但是这里的结果是类型:System.Web.Mvc.RedirectToRouteResult(它是一个System.Web.Mvc.ActionResult)。它还没有执行“详细信息”方法。
我已经尝试在返回的对象上调用ExecuteResult,传递一个嘲笑的ControllerContext,但框架并不满足于嘲笑对象中缺少细节。
我可以尝试填写细节等等,但是我的测试代码比我测试的代码更长,我觉得我需要单元测试单元测试!
我在测试哲学中缺少某些东西吗?当我不能得到返回状态时,如何测试这个动作?
解决方法
我正在使用MVC2 RC2,而rmacfie的答案对我来说并不是很有用,但是让我走上了正轨。
我或者我错误地设法在我的测试中做到这一点:
var actionResult = (RedirectToRouteResult)logonController.ForgotUsername(model); actionResult.RouteValues["action"].should_be_equal_to("Index"); actionResult.RouteValues["controller"].should_be_equal_to("logon");
不知道这是否会帮助某人,但可能会节省你10分钟。