Я недавно решил одну из своих проблем с помощью шаблона "декоратор". Все хорошо работает, и все отделяется достаточно (или таким образом, я думаю), что я могу к модульному тесту каждое validitable поле отдельно.
Мой вопрос, если NameValidator и AgeValidator оба проходят тесты для Проверения () и IsValid () (абстрактные) функции. Мне все еще нужен к модульному тесту мой класс ValidationDecorator (не созданный уже)? ValidationDecorator был бы reponsible для украшения моего блока проверки допустимости с каждым классом проверки.
public abstract class FieldValidator
{
protected IMessage validateReturnType;
public FieldValidator() { }
public bool IsValid()
{
return (validateReturnType.GetType() == typeof(Success));
}
}
public class NameValidator : FieldValidator, IValidator
{
private string name;
public NameValidator(string _name) {
name = _name;
}
public IMessage Validate()
{
if (name.Length < 5)
{
validateReturnType = new Error("Name error.");
}
else
{
validateReturnType = new Success("Name no errror.");
}
return validateReturnType;
}
}
public class AgeValidator : FieldValidator, IValidator
{
private int age;
public AgeValidator(int _age)
{
age = _age;
}
public IMessage Validate()
{
if (age <= 18)
{
validateReturnType = new Error("Age error.");
}
else
{
validateReturnType = new Success("Age no errror.");
}
return validateReturnType;
}
}
public interface IValidator
{
IMessage Validate();
bool IsValid();
}
Это - мой модульный тест.
[TestFixture]
public class ValidatorTest
{
Type successType;
Type errorType;
Model m;
[SetUp]
public void SetUp()
{
successType = typeof(Success);
errorType = typeof(Error);
m = new Model();
m.Name = "Mike Cameron";
m.Age = 19;
m.Height = 325;
Validator v = new Validator();
v.Validate(m);
}
[Test]
public void ValidateNameTest()
{
IValidator im = new NameValidator(m.Name);
IMessage returnObj = im.Validate();
Assert.AreEqual(successType, returnObj.GetType());
}
[Test]
public void IsValidNameTest()
{
IValidator im = new NameValidator(m.Name);
IMessage returnObj = im.Validate();
Assert.IsTrue(im.IsValid());
}
[Test]
public void ValidateAgeTest()
{
IValidator im = new AgeValidator(m.Age);
IMessage returnObj = im.Validate();
Assert.AreEqual(successType, returnObj.GetType(), "Must be over 18");
}
[Test]
public void IsValidAgeTest()
{
IValidator im = new AgeValidator(m.Age);
IMessage returnObj = im.Validate();
Assert.IsTrue(im.IsValid());
}
Спасибо.
Практическое правило - «проверяйте все, что может сломаться». Теперь судить о том, что может сломаться, далеко не тривиально в реальных жизненных обстоятельствах. Чтобы сделать это правильно, нужны практика и опыт. И дать общий совет невозможно, тем более не видя своего дизайна и кода.
Итак, в конце концов, только вы можете надежно оценить, достаточно ли вы уверены в том, что ValidationDecorator
настолько тривиален, что он никогда не сломается. Если вы сомневаетесь, лучше ошибиться в сторону слишком большого количества тестов :-) Это означает, что вы потратите дополнительное время на, возможно, несущественную задачу. Напротив - неспособность написать необходимый модульный тест - означает, что вы можете позволить ошибке проскользнуть через вашу сеть, что обычно является более серьезной проблемой.
Да, вам следует выполнить модульное тестирование любого класса, который может содержать ошибки. Для модульного тестирования вашего класса ValidationDecorator вы должны использовать имитацию или заглушку реализации IValidator.