2010-05-14 82 views
1

我很難找到我期望成爲一個非常簡單的場景的信息。我試圖在我的ASP.NET Mvc 2控制器上使用具有DataAnnotions的自定義輸入模型對單元進行單元測試。正如標題中提到的,我的測試框架是xUnit。單元測試(xUnit)具有自定義輸入模型的ASP.NET Mvc控制器?

這裏是我的自定義輸入模型

public class EnterPasswordInputModel 
{ 
    [Required(ErrorMessage = "")] 
    public string Username { get; set; } 

    [Required(ErrorMessage = "Password is a required field.")] 
    public string Password { get; set; } 
} 

這裏是我的控制器(拿出一些邏輯來簡化此例):

[HttpPost] 
public ActionResult EnterPassword(EnterPasswordInputModel enterPasswordInput) 
{ 
    if (!ModelState.IsValid) 
     return View(); 

    // do some logic to validate input 
    // if valid - next View on successful validation 
     return View("NextViewName"); 
    // else - add and display error on current view 
     return View(); 
} 

這裏是我的x單位事實(也簡化了):

[Fact] 
public void EnterPassword_WithValidInput_ReturnsNextView() 
{ 
    // Arrange 
    var controller = CreateLoginController(userService.Object); 

    // Act 
    var result = controller.EnterPassword(
     new EnterPasswordInputModel 
      { 
       Username = username, Password = password 
      }) as ViewResult; 

    // Assert 
    Assert.Equal("NextViewName", result.ViewName); 
} 

當我運行我的測試,我得到以下錯誤在我的測試其實試圖檢索控制器結果時(法部分):

System.NullReferenceException: Object reference not set to an instance of an object. 

預先感謝您可以提供任何幫助!

+0

當您調試,NULL是什麼?的ModelState? – Jab 2010-05-14 13:21:45

回答

1

我想我正在尋找解決方案。下面是我對控制器進行更改:更新

if (!TryUpdateModel(loginInput)) 
      return View(); 

原始

if (!ModelState.IsValid) 
    return View(); 

似乎模型結合我的測試過程中沒有發生。除非發生POST,否則模型綁定似乎不會發生。通過強制嘗試模型綁定,我能夠通過測試。

注意:也有在我的行動的錯誤是造成我試圖找出爲什麼我的模型沒有被證實引起了我原來的空引用。

參考: http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html

+1

哎呦 - 堆棧溢出示例我更新應該使用「enterPasswordInput」而不是「loginInput」。後者用於我的真實代碼。 = P – 2010-05-14 14:28:48

0

您在控制器操作中取消了一個空實例的引用。您可能在代碼中「簡化」了這個問題。看看測試結果中的調用堆棧來找出什麼。您可能需要爲測試嘲弄某些東西。

+1

砸我原來的錯誤!真正的問題是我的Model未在控制器操作中使用ModelState.IsValid進行驗證。我的迴應如下擴展... – 2010-05-14 14:34:30

相關問題