Модульное тестирование для проекта VS2017 - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть приложение ASP.NET (базовая форма, где я собираю некоторые данные) в VS2017.

Одним из полей в форме является Mark, которое является целым числом.

У меня есть следующий блок кода для Mark в моем файле .cs.

    [Display(Name = "Mark")]
    [Range(1, 10, ErrorMessage = "Mark must be between 1 and 10")]                              
    public int Mark{ get; set; }

Я создал проект MSTest для этого приложения для написания модульных тестов.

Мой вопрос: вы пишете тестовые случаи для этого блока, чтобы убедиться, что входное значение находится в ожидаемом диапазоне?

Если да, то как ты это пишешь?

Я начал с этого.

    [DataRow(0, "Mark must be between 1 and 10")]
    [DataRow(11, "Mark must be between 1 and 10")]
    [DataTestMethod]
    public void TestMark_IsMarkValid_NotValid(int mark, string expectedMsg)
    {
        //Arrange
        Student testStudent = new Student();
        testStudent.Mark = mark; //this does not throw any error, although the assigned value is outside of the defined range. But it looks like the range validation only applies to the webform.

        //Act

        string actualMsg = "Mark must be between 1 and 10"; //this is not correct. I was thinking to capture in the actual result the error message yield by the Range validation, but assigning a value outside range doesn't yield any error message. 

        //Assert
        Assert.AreEqual(expectedMsg, actualMsg);
    }

Теперь не уверен, должен ли этот блок находиться в области видимости для модульного тестирования. Если это так, я чувствую, что мой подход неверен.

Есть мысли, пожалуйста?

Большое спасибо, Космин

1 Ответ

0 голосов
/ 12 ноября 2018

Интересный вопрос. Я не уверен, что есть окончательно правильный ответ. Но вот мои мысли:

1) «Марк» является собственностью. Нам не нужно юнит-тестирование свойства, потому что Microsoft уже проверила, что свойства работают.

2) Атрибуты не влияют на свойство, но предоставляют информацию о свойстве, которое могут использовать другие. Вот почему ваш модульный тест проходит тест на значение. Форма использует атрибуты, а ваш модульный тест - нет. Вот почему ваш модульный тест может присвоить любое значение.

3) Если вы действительно хотите ограничить значение переменной, а затем ограничить ее в классе Student - либо установщиком, либо явным образом get / set и вспомогательной переменной - вы никогда не сможете доверять никаким данным, переданным браузером.

4) Тестирование интерфейса не так просто. У нас есть команда тестирования, которая тестирует вручную. Мы испробовали несколько инструментов, но ни один из них не является выдающимся. Не подпускайте бизнес-логику к своему пользовательскому интерфейсу и помещайте ее в бизнес-классы, где ее можно легко протестировать

Итак, чтобы ответить на ваш вопрос, я лично не проверял бы, что атрибут функционирует в модульном тесте.

Надеюсь, это поможет.

...