тестовый метод контроллера + DataAnnotations - asp.net mvc 3 - PullRequest
0 голосов
/ 22 июня 2011

Это продолжение:

другое сообщение SO

Это хороший способ проверить, работает ли проверка, основанная на аннотациях данных, в контроллере:

[Test]
public void UserController_CannotCreateUserWithNoLastName()
{
    // Arrange
    var user = new CreateUserViewModel();
    UsersController controller = new UsersController();
    var validationContext = new ValidationContext(user, null, null);
    var validationResults = new System.Collections.Generic.List<ValidationResult>();
    Validator.TryValidateObject(user, validationContext, validationResults);
    foreach (var validationResult in validationResults)
    {
    controller.ModelState.AddModelError("", validationResult.ErrorMessage);
    }

    // Act
    var result = controller.CreateUser(user);

    // Assert
    Assert.IsFalse(controller.ModelState.IsValid);
}

Любые предложения по улучшению приветствуются. Мне также интересно, пишут ли обычно один тест для каждого валидационного / бизнес-правила. Спасибо!

1 Ответ

0 голосов
/ 22 июня 2011

Код, который вы перечислили, основан на том, что найдено здесь ?

Лично я пишу такие тесты для каждой аннотации:

    [Test]
    public void CreateEventViewModel_Description_Property_Contains_StringLength_Attribute()
    {
        // Arrange
        PropertyInfo propertyInfo = typeof(CreateEventViewModel)
                                       .GetProperty("Description");
        // Act
        StringLengthAttribute attribute = propertyInfo
                      .GetCustomAttributes(typeof(StringLengthAttribute), true)
            .Cast<StringLengthAttribute>()
            .FirstOrDefault();

        // Assert
        Assert.NotNull(attribute);
        Assert.AreEqual(255, attribute.MaximumLength);
    }

Iосновываясь на некоторой информации, которую Брэд Уилсон опубликовал некоторое время назад.Эти тесты хранятся отдельно от тестов контроллера.Я не уверен, есть ли более эффективный способ сделать это сегодня (некоторые люди создали более универсальные вспомогательные методы для этого типа тестирования; я просто предпочитаю иметь явные тесты для каждого атрибута самостоятельно), но он проверит, что вашаннотации данных существуют в ваших моделях представления, как и ожидалось.

Комбинация этого типа теста, в частности, проверки атрибутов, вместе с тестами для проверки состояния модели, как указано в предыдущем вопросе

UsersController.ModelState.AddModelError("username", "Bad username"); 

это то, что я обычно иду с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...