Я пытаюсь написать модульные тесты для пост-действия ASP.NET MVC 2, в котором модель представления является единственным параметром. Модель представления украшена атрибутами проверки, такими как [Обязательный]. Я хотел бы проверить два сценария. Первый сценарий - когда передается действительный набор данных (т. Е. Все необходимые свойства имеют значения) и возвращается перенаправление на страницу списка. Второй сценарий включает передачу неверных данных (например, когда одно или несколько обязательных свойств не установлены). В этом случае тот же самый вид возвращается с сообщениями об ошибках.
подпись действия выглядит следующим образом:
[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);
}
Этот тест проходит, как и ожидалось, возвращается действие перенаправления обратно на страницу списка. Я хотел бы создать клон этого, в результате чего ряд необходимых свойств будут нулевыми или пустыми. В этом случае тест должен возвращать возвращаемое действие визуализации, а не перенаправление. Моя попытка заключается в следующем:
[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();
}
Несмотря на то, что я передаю значение NULL для свойства Content и пустую строку для свойства Category, модульный тест не выполняется, поскольку ViewState указывает, что модель действительна при вызове действия Create.
Я предполагаю, что код проверки не был вызван, когда я вызываю действие, поскольку я вызываю его напрямую, я не удивлен. Итак, как я могу написать модульный тест, который будет выполнять все ожидаемые проверки модели представления, прежде чем я вызову метод действия?
Я использую: ASP.NET MVC2, NUnit 2.5.7 и MvcContrib 2.0.96.0.
Спасибо за любую помощь.
Гленн.