代码之家  ›  专栏  ›  技术社区  ›  Peter Mounce

如何在单轨控制器单元测试中伪造验证错误?

  •  3
  • Peter Mounce  · 技术社区  · 16 年前

    我在Castle的主干上运行,并尝试在设置了DTO验证的地方对控制器操作进行单元测试。控制器继承自SmartDispatcherController。动作和数据如下:

    
    [AccessibleThrough(Verb.Post)]
    public void Register([DataBind(KeyReg, Validate = true)] UserRegisterDto dto)
    {
        CancelView();
        if (HasValidationError(dto))
        {
            Flash[KeyReg] = dto;
            Errors = GetErrorSummary(dto);
            RedirectToAction(KeyIndex);
        }
        else
        {
            var user = new User { Email = dto.Email };
            // TODO: Need to associate User with an Owning Account
            membership.AddUser(user, dto.Password);
            RedirectToAction(KeyIndex);
        }
    }
    
    public class UserRegisterDto
    {
        [ValidateNonEmpty]
        [ValidateLength(1, 100)]
        [ValidateEmail]
        public string Email { get; set; }
    
        [ValidateSameAs("Email")]
        public string EmailConfirm { get; set; }
    
        [ValidateNonEmpty]
        public string Password { get; set; }
    
        [ValidateSameAs("Password")]
        public string PasswordConfirm { get; set; }
    
        // TODO: validate is not empty Guid
        [ValidateNonEmpty]
        public string OwningAccountIdString { get; set; }
    
        public Guid OwningAccountId
        {
            get { return new Guid(OwningAccountIdString); }
        }
    
        [ValidateLength(0, 40)]
        public string FirstName { get; set; }
    
        [ValidateLength(0, 60)]
        public string LastName { get; set; }
    }
    

    单元测试如下:

    
    [Fact]
    public void Register_ShouldPreventInValidRequest()
    {
        PrepareController(home, ThorController.KeyPublic, ThorController.KeyHome, HomeController.KeyRegister);
    
        var dto = new UserRegisterDto { Email = "ff" };
        home.Register(dto);
    
        Assert.True(Response.WasRedirected);
        Assert.Contains("/public/home/index", Response.RedirectedTo);
        Assert.NotNull(home.Errors);
    }
    

    (“home”是测试中的homecontroller实例;home.error s包含对错误摘要的引用,当出现验证错误时,应将其放入闪存中)。

    我看到调试器认为DTO没有验证错误;很明显,它应该有几个失败,就像测试运行的方式一样。

    我读过 Joey's blog post on this 但是看起来城堡的后备箱从这篇文章开始就一直在移动。有人能开灯吗?

    1 回复  |  直到 16 年前