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