【问题标题】:How do I test response data using nUnit?如何使用 nUnit 测试响应数据?
【发布时间】:2012-08-03 13:16:09
【问题描述】:

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

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

什么是最好的解决方案?

【问题讨论】:

    标签: asp.net unit-testing nunit


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

    【讨论】:

    • 对于模型验证,有一些方法来验证(随着需求的变化和多只手接触代码)验证规则集保持不变是很方便的。与其说测试 [Required] 是否有效,不如说 BlahModel.FirstName 仍然是必需的。哦,还有关于状态代码的任何想法吗?
    • 状态码应该在控制器方法的返回结果中,因此您可以返回 RedirectToAction 或其他方式,而不是返回带有模型的视图,并在您的断言中验证它。我将在另一个答案中扩展模型验证...
    【解决方案2】:

    要显式测试对象的 [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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多