如何进行单元测试以关闭请求验证?

时间:2010-12-20 20:24:51

标签: asp.net unit-testing asp.net-mvc-3 request-validation

我是这个TDD的新手,但是做了认真的努力,所以我希望能在这里得到一些反馈。

我创建了一个小的Web服务来缩小JavaScript,一切都很好,我的所有测试都通过了。然后我注意到一个错误:如果我试图缩小alert('<script>');,它会抛出一个HttpRequestValidationException

所以这很容易修复。我只需将[AllowHtml]添加到我的控制器中。但是,对于未来不会发生这种情况进行单元测试的好方法是什么呢?

以下是我的第一个想法:

[TestMethod]
public void Minify_DoesntChokeOnHtml()
{
    try
    {
        using (var controller = ServiceLocator.Current.GetInstance<MinifyController>())
        {
            return controller.Minify("alert('<script></script>');");
        }
    }
    catch (HttpRequestValidationException)
    {
        Assert.Fail("Request validation prevented HTML from existing inside the JavaScript.");
    }
}

但是,这不起作用,因为我只是获取一个控制器实例并在其上运行方法,而不是启动整个ASP.NET管道。

对此有什么好的单元测试?可能是控制器方法上的反射器,看看[AllowHtml]属性是否存在?这似乎非常具有结构性,并且不太可能在重构中存活下来;功能性的东西可能更有意义。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您只有两个选择:

<强>第一

编写承载MVC in-proc的集成测试,或使用浏览器(例如使用Watin)运行,它将覆盖您的场景。

<强>第二

编写单元测试,检查该方法是否标有所需属性。

我会选择第一个选项。