Тест должен быть получен из некоторого варианта использования. Самое смешное, что сначала вы представили свой класс, а затем поговорили о написании теста, обратного TDD.
Вариант использования информирует тест, который сообщает код. Я очень сомневаюсь, что ваш вариант использования таков: «пользователь моего API может установить свойство с именем PartQty
для любого целого числа и всегда получить обратно целое число, которое он установил». Если бы это был реальный вариант использования, вы бы написали модульный тест, который проверяет int.MaxValue
и int.MinValue
. Тем не менее, это редко реальные ценности.
Реальный сценарий использования может выглядеть следующим образом: "пользователь моих новостей API вводит Bib
, вводя IFlugleBinder
, устанавливает PartQty
в 4 и затем вызывает метод Execute
. Это вызывает Bind
метод на экземпляре IFlugleBinder
4 раза. " Если бы это был вариант использования, ваш тест выглядел бы совсем иначе.
Честно говоря, похоже, что Bib
это просто DTO какого-то рода. По моему опыту, большинство DTO - просто артефакт некоторого варианта использования более высокого уровня. Если DTO возвращается как результат вызова функции, предоставляемого вашим API, тогда вы действительно должны возвращать интерфейс, а сам класс DTO должен быть закрытым, и в этом случае нет необходимости тестировать его явно (просто протестируйте свойства фактического результата, который вы получаете от вызова метода). Точно так же, если это внутренний DTO, который никогда не раскрывается, тогда не делайте его публичным. Если ваш пользователь должен предоставить некоторый набор значений, то ваш API должен принимать интерфейс. Пусть пользователь определит свой собственный класс, который реализует интерфейс, или предоставит неизменный класс, например:
public class Bib : IBib
{
public Bib(int partQty)
{
PartQty = partQty;
}
public int PartQty { get; private set; }
}
Затем вы можете написать тест, который проверяет, работает ли ваш конструктор, если вы хотите быть педантичным, но это не так важно.