2012-08-03 12 views
1

Django具有非常方便的test client /虛擬web瀏覽器,可以在測試用例中使用它來驗證HTTP響應(例如,狀態代碼,上下文/模型數據)的正確性。它不要求您運行Web服務器,因爲它直接處理框架來模擬調用。如何使用nUnit測試響應數據?

我真的很喜歡nUnit(或類似的)等價物,我們可以直接進入我們的測試套件。我們正在使用MVC3和4,並且希望檢查301成功重定向,模型驗證是正確的,ViewModel數據在視圖中是正確的。

這是最好的解決方案是什麼?

回答

1

視圖模型的數據應該很容易檢查用以下:

public T GetViewModelFromResult<T>(ActionResult result) where T : class 
    { 
     Assert.IsInstanceOf<ViewResult>(result); 
     var model = ((ViewResult)result).Model; 
     Assert.IsInstanceOf<T>(model); 
     return model as T; 
    } 

    [Test] 
    public void TheModelHasTheOrder() 
    { 
     var controller = new MyController(); 
     var result = controller.MyActionMethod(); 
     var model = GetViewModelFromResult<MyModel>(); 

     Assert.That(model, Is.SameAs(???)); 
    } 

對於模型驗證,如果您使用的是開箱.NET財產屬性,如[必填]等,你可以很確定他們會正常工作,並且不需要測試。

+0

對於模型驗證,這是方便有方法來驗證(根據需求的變化和多手觸摸代碼)驗證規則集保持不變。它不太需要測試[必需]的工作方式,還是需要BlahModel.FirstName。哦,還有關於狀態碼的任何想法? – 2012-08-03 14:33:35

+0

狀態代碼應該在控制器方法的返回結果中,而不是返回一個帶有模型的視圖,您可以返回一個RedirectToAction或其他方法,並在您的斷言中驗證它。我將在另一個答案中擴展模型驗證... – Nick 2012-08-03 15:53:50

0

要明確地測試對象上的[必需的] etc屬性,您需要將內置的.net驗證提取到另一個類中。然後在控制器中使用該類來驗證您的對象,而不是控制器上的Model.IsValid屬性。

模型驗證程序類:

public class ModelValidator : IModelValidator 
{ 
    public bool IsValid(object entity) 
    { 
     return Validate(entity, new List<ValidationResult>()); 
    } 

    public IEnumerable<ValidationResult> Validate(object entity) 
    { 
     var validationResults = new List<ValidationResult>(); 
     Validate(entity, validationResults); 
     return validationResults; 
    } 

    private static bool Validate(object entity, ICollection<ValidationResult> validationResults) 
    { 
     if (entity != null) 
     { 
      var validationContext = new ValidationContext(entity, null, null); 
      return Validator.TryValidateObject(entity, validationContext, validationResults);  
     } 

     return false; 
    } 
} 

這可能是單元測試可驗證下列要求:

public class MySampleEntity 
{ 
    [Required] 
    public string X { get; set; } 

    [Required] 
    public int Y { get; set; } 
} 

[TestFixture] 
public class ModelValidatorTests 
{ 
    [Test] 
    public void GivenThePropertiesArePopulatedTheModelIsValid() 
    { 
     // arrange 
     var _validator = new ModelValidator(); 
     var _entity = new MySampleEntity { X = "ABC", Y = 50 }; 

     // act 
     var _result = _validator.IsValid(_entity); 

     // assert 
     Assert.That(_result, Is.True); 
    } 
}