1

Django 有一个非常方便的测试客户端/虚拟网络浏览器,可以在测试用例中使用它来验证 HTTP 响应的正确性(例如,状态代码、上下文/模型数据)。它不需要您运行 Web 服务器,因为它直接处理框架来模拟调用。

我真的很喜欢一个 nUnit(或类似的)等价物,我们可以直接滑入我们的测试套件。我们正在使用 MVC3 和 4,并且想要检查诸如成功的 301 重定向、模型验证是否正确以及视图中的 ViewModel 数据是否正确等内容。

什么是最好的解决方案?

4

2 回答 2

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] 等,您可以确定它们可以正常工作,并且不需要测试。

于 2012-08-03T13:47:33.237 回答
0

要显式测试对象上的 [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);
    }
}
于 2012-08-03T16:12:20.113 回答