Django具有非常方便的test client /虛擬web瀏覽器,可以在測試用例中使用它來驗證HTTP響應(例如,狀態代碼,上下文/模型數據)的正確性。它不要求您運行Web服務器,因爲它直接處理框架來模擬調用。如何使用nUnit測試響應數據?
我真的很喜歡nUnit(或類似的)等價物,我們可以直接進入我們的測試套件。我們正在使用MVC3和4,並且希望檢查301成功重定向,模型驗證是正確的,ViewModel數據在視圖中是正確的。
這是最好的解決方案是什麼?
Django具有非常方便的test client /虛擬web瀏覽器,可以在測試用例中使用它來驗證HTTP響應(例如,狀態代碼,上下文/模型數據)的正確性。它不要求您運行Web服務器,因爲它直接處理框架來模擬調用。如何使用nUnit測試響應數據?
我真的很喜歡nUnit(或類似的)等價物,我們可以直接進入我們的測試套件。我們正在使用MVC3和4,並且希望檢查301成功重定向,模型驗證是正確的,ViewModel數據在視圖中是正確的。
這是最好的解決方案是什麼?
視圖模型的數據應該很容易檢查用以下:
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財產屬性,如[必填]等,你可以很確定他們會正常工作,並且不需要測試。
要明確地測試對象上的[必需的] 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);
}
}
對於模型驗證,這是方便有方法來驗證(根據需求的變化和多手觸摸代碼)驗證規則集保持不變。它不太需要測試[必需]的工作方式,還是需要BlahModel.FirstName。哦,還有關於狀態碼的任何想法? – 2012-08-03 14:33:35
狀態代碼應該在控制器方法的返回結果中,而不是返回一個帶有模型的視圖,您可以返回一個RedirectToAction或其他方法,並在您的斷言中驗證它。我將在另一個答案中擴展模型驗證... – Nick 2012-08-03 15:53:50