我正在尝试为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。
感谢您的帮助。 格伦。