asp.net-mvc - 使用 Recaptcha 对 Action 进行单元测试

标签 asp.net-mvc unit-testing asp.net-mvc-3

我如何测试 Controller 的以下操作:

 public ActionResult Edit(User usr)
    {
        if (!Microsoft.Web.Helpers.ReCaptcha.Validate(ConfigurationManager.AppSettings["reCaptchaPrivate"].ToString()))
        {
            ModelState.AddModelError("reCaptcha", PPRR.App_LocalResources.Global.ErrorFillReCaptcha);
            return PartialView("Wrong", usr);
        }
        if (ModelState.IsValid)
        {code..... }}

最佳答案

我将从提取验证码验证码开始:

public interface ICaptchaValidator
{
    bool Validate();
}

然后让我的 Controller 看起来像这样:

public class FooController: Controller
{
    private readonly ICaptchaValidator _validator;
    public FooController(ICaptchaValidator validator)
    {
        _validator = validator;
    }

    public ActionResult Edit(User usr)
    {
        if (!_validator.Validate())
        {
            ModelState.AddModelError("reCaptcha", PPRR.App_LocalResources.Global.ErrorFillReCaptcha);
            return PartialView("Wrong", usr);
        }

        ...
    }
}

现在您已经削弱了 Controller 与验证码验证方式之间的耦合。这是一件好事,因为它使您的 Controller 操作更容易进行单元测试。我们已经成功地使我们的 Controller 独立于验证的实际实现方式。

现在只需选择一个模拟框架,例如 Rhino Mocks、Moq、NSubstitute,然后在您的单元测试中将一个 stub 验证器注入(inject)到该 Controller 中,以便您可以在其上定义行为。

我个人会推荐你MvcContrib.TestHelper (基于 Rhino Mocks)来测试您的 ASP.NET MVC 应用程序。它有许多内置的好东西,可以模拟 HttpContext 并使单元测试变得容易。

下面是如何测试验证失败案例的示例:

[TestMethod]
public void FooController_Edit_Action_Should_Return_The_Wrong_Partial_If_Captcha_Validation_Fails()
{
    // arrange
    var validatorStub = MockRepository.GenerateStub<ICaptchaValidator>();
    var sut = new HomeController(validatorStub);
    var user = new User();
    validatorStub.Stub(x => x.Validate()).Return(false);

    // act
    var actual = sut.Edit(user);

    // assert
    actual
        .AssertPartialViewRendered()
        .ForView("Wrong")
        .WithViewData<User>()
        .Equals(user);
    Assert.IsFalse(sut.ModelState.IsValid);
}

关于asp.net-mvc - 使用 Recaptcha 对 Action 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6668015/

相关文章:

asp.net-mvc-3 - 如何在不使用 Web 平台安装程序(并且不使用 Visual Studio)的情况下在服务器上安装 MVC3?

c# - 如何在 ASP.NET MVC 中的应用程序生命周期中仅初始化和取消初始化一次

c# - 如何使用泛型或动态转换为一个函数?

c# - Linq-to-SQL 的开销

asp.net-mvc-3 - 使用 csvhelper (nuGET) 和 C# MVC 导入 CSV 文件

.net - EF LINQ 包括多个嵌套实体

asp.net-mvc - 无法查看 Azure 云服务中的应用程序错误

c# - 是否可以通过某些配置使所有内部类对 C# 中的另一个程序集可见?

c# - 当等待模拟方法时,单元测试中的 NRE

unit-testing - 我怎样才能 "sleep"一个 Dart 程序