Django有一个非常方便的test client /虚拟Web浏览器,可以在测试用例中使用它来验证HTTP响应的正确性(例如,状态代码,上下文/模型数据)。它不需要您运行Web服务器,因为它直接处理框架以模拟调用。
我真的很喜欢nUnit(或类似的)等价物,我们可以直接进入我们的测试套件。我们正在使用MVC3和4,并希望检查成功的301重定向,模型验证是否正确以及ViewModel数据在视图中是否正确。
对此最佳解决方案是什么?
答案 0 :(得分:1)
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属性属性,如[Required]等,您可以非常确定它们能正常工作,并且不需要测试。
答案 1 :(得分:0)
要显式测试对象的[Required] 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);
}
}