ASP.NET MVC重定向单元测试

17

如何对MVC重定向进行单元测试?

public ActionResult Create(Product product)
{
    _productTask.Save(product);
    return RedirectToAction("Success");   
}

public ActionResult Success()
{ 
     return View();
}

在预览版本5中,Ayende的方法仍然是最好的选择吗:

 public static void RenderView(this Controller self, string action) 
 {
    typeof(Controller).GetMethod("RenderView").Invoke(self,new object[] { action} ); 
 }

看起来很奇怪要这样做,尤其是因为MVC团队表示他们正在编写可测试的框架。

4个回答

29
[TestFixture]
public class RedirectTester
{
    [Test]
    public void Should_redirect_to_success_action()
    {
        var controller = new RedirectController();
        var result = controller.Index() as RedirectToRouteResult;
        Assert.That(result, Is.Not.Null);
        Assert.That(result.Values["action"], Is.EqualTo("success"));
    }
}

public class RedirectController : Controller
{
    public ActionResult Index()
    {
        return RedirectToAction("success");
    }
}

9
RedirectToRouteResult.Values[] 现在变成了 RedirectToRouteResult.RouteValues[...]。 - mxmissile
有人知道在测试重定向期间如何实际触发操作吗? - f0ster
@f0ster 你为什么想要那个?无论如何,上面的例子中 controller.Success() 就可以实现这个。 - bzlm

0
这适用于ASP.NET MVC 5使用NUnit的情况:
    [Test]
    public void ShouldRedirectToSuccessAction()
    {
        var controller = new RedirectController();
        var result = controller.Index() as RedirectToRouteResult;

        Assert.That(result.RouteValues["action"], Is.EqualTo("success"));
    }

如果您想测试是否重定向到另一个控制器(比如NewController),则断言应该是:
```python self.assertRedirects(response, '/new_controller/') ```
Assert.That(result.RouteValues["controller"], Is.EqualTo("New"));

-1

根据FAQ中的说明,"要小心,因为社区不赞成公然自我推销,往往会将其投票下降并标记为垃圾邮件。发布好的、相关的答案,如果它们恰好与您的产品或网站有关,那就这样吧。但是,在您的答案中必须披露您的从属关系。此外,如果您的帖子中有很大一部分提到您的产品或网站,那么您可能是出于错误的原因而在这里。" - user1228

-1

你可以对返回的ActionResult进行断言,但需要将其转换为适当的类型,这样可以使用基于状态的测试。在网上搜索应该能找到一些有用的链接,这里只提供一个


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接