2008-10-28 33 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主幹已經寫入,因爲這寫了。請問有人可以點亮燈光嗎?

回答