Как проверить действие ASP.NET MVC2 после проверки с использованием MvcContrib TestHelper? - PullRequest
1 голос
/ 13 октября 2010

Я пытаюсь написать модульные тесты для пост-действия 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.

Спасибо за любую помощь. Гленн.

1 Ответ

1 голос
/ 13 октября 2010

Я бы порекомендовал вам прочитать отличное сообщение Брэда Уилсона в блоге на эту тему.В основном он использует отражение, чтобы гарантировать, что надлежащие атрибуты будут применены к вашей модели, и для выполнения своей работы полагаться на каркас.

...