如何使用nUnit测试响应数据?

时间:2012-08-03 13:16:09

标签: asp.net unit-testing nunit

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

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

对此最佳解决方案是什么?

2 个答案:

答案 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);
    }
}