2008-10-28 35 views
3

我在城堡的树干上运行,并尝试对设置了我的DTO的验证的控制器操作进行单元测试。控制器从SmartDispatcherController继承。动作和DTO的样子:如何在MonoRail控制器单元测试中伪造验证错误?


[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); 
} 

(“家”是在测试我的HomeController实例; home.Errors持有至ErrorSummary参考其应当出现验证错误时将其放入Flash中)。

我看到调试器认为dto没有验证错误;它显然应该有几个失败,测试运行的方式。

我已阅读Joey's blog post on this,但它看起来像Castle主干已经写入,因为这写了。请问有人可以点亮灯光吗?

回答