在使用MvcContrib TestHelper时,如何使用验证测​​试ASP.NET MVC2后期操作?

时间:2010-10-12 22:39:51

标签: c# asp.net asp.net-mvc-2 nunit mvccontrib

我正在尝试为ASP.NET MVC 2后期操作编写单元测试,该操作将视图模型作为其唯一参数。视图模型使用验证属性(如[必需])进行修饰。我想测试两个场景。第一种情况是传入一组有效数据(即,所有必需属性都有值),并返回到列表页面的重定向。第二种情况涉及传递无效数据(例如,当未设置一个或多个Required属性时)。在这种情况下,将返回相同的视图,并显示错误消息。

行动签名如下:

[HttpPost]
public virtual ActionResult Create(NewsViewModel model)

NewsViewModel类如下:

public class NewsViewModel
{

    public Guid Id { get; set; }

    public DateTime? PublishStartDate { get; set; }

    public DateTime? PublishEndDate { get; set; }

    [Required]
    [StringLength(1000, 
        ErrorMessage = "Title must be less than 1000 characters.")]
    [HtmlProperties(Size = 100, MaxLength = 1000)]
    public string Title { get; set; }

    [Required]
    public string Content { get; set; }

    [DisplayName("Published")]
    [Required]
    public bool IsPublished { get; set; }

    [Required]
    public string Category { get; set; }

    public DateTime PublishedDateTime { get; set; }
}

我对第一个场景的单元测试如下:

[Test]
public void Create_Post()
{
    DateTime now = DateTime.Now;
    Guid id = Guid.NewGuid();

    // Act
    NewsViewModel viewModel = new NewsViewModel()
    {
        Id = id,
        Title = "Test News",
        Content = "this is the content",
        Category = "General",
        PublishedDateTime = now,
        PublishEndDate = now.Add(new TimeSpan(1, 0, 0)),
        PublishStartDate = now.Subtract(new TimeSpan(1, 0, 0))
    };

    ActionResult result = _controller.Create(viewModel);

    // Assert
    result.AssertActionRedirect();
}

使用MvcContrib TestControllerBuilder在测试设置中创建控制器:

private IWebDataService _webDataServiceFake;
private TestControllerBuilder _builder;
private PortalNewsController _controller;

[SetUp]
public void Setup()
{
    _webDataServiceFake = new WebDataService(new EntityDataServiceFake());
    _controller = new PortalNewsController(_webDataServiceFake);
    _builder = new TestControllerBuilder();
    _builder.InitializeController(_controller);
}

此测试按预期传递,返回返回列表页面的操作重定向。我想创建一个克隆,其中许多必需的属性为null或空。在这种情况下,测试应该返回一个视图渲染操作而不是重定向。我的尝试如下:

[Test]
public void Create_PostInvalid()
{
    DateTime now = DateTime.Now;
    Guid id = Guid.NewGuid();

    // Act
    NewsViewModel viewModel = new NewsViewModel()
    {
        Id = id,
        Title = null,
        PublishedDateTime = now,
        PublishEndDate = now.Add(new TimeSpan(1, 0, 0)),
        PublishStartDate = now.Subtract(new TimeSpan(1, 0, 0)),
        Content = null,
        Category = ""
    };

    ActionResult result = _controller.Create(viewModel);

    // Assert
    result.AssertViewRendered();
}

即使我传入的是Content属性的null和Category属性的空字符串,单元测试也会失败,因为当我调用Create操作时,ViewState指示模型有效。

我假设在调用动作时没有调用验证代码,因为我直接调用它并不会感到惊讶。那么在调用action方法之前,如何编写一个单元测试来对视图模型执行所有预期的验证呢?

我正在使用:ASP.NET MVC2,NUnit 2.5.7和MvcContrib 2.0.96.0。

感谢您的帮助。 格伦。

1 个答案:

答案 0 :(得分:1)

我建议你阅读Brad Wilson关于这个主题的excellent blog post。基本上它使用反射来确保将适当的属性应用于模型并依赖框架来完成其工作。