Поблочное тестирование шаблон "декоратор"

Я недавно решил одну из своих проблем с помощью шаблона "декоратор". Все хорошо работает, и все отделяется достаточно (или таким образом, я думаю), что я могу к модульному тесту каждое 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());
    }

Спасибо.

5
задан Mike 11 June 2010 в 16:57
поделиться

2 ответа

Практическое правило - «проверяйте все, что может сломаться». Теперь судить о том, что может сломаться, далеко не тривиально в реальных жизненных обстоятельствах. Чтобы сделать это правильно, нужны практика и опыт. И дать общий совет невозможно, тем более не видя своего дизайна и кода.

Итак, в конце концов, только вы можете надежно оценить, достаточно ли вы уверены в том, что ValidationDecorator настолько тривиален, что он никогда не сломается. Если вы сомневаетесь, лучше ошибиться в сторону слишком большого количества тестов :-) Это означает, что вы потратите дополнительное время на, возможно, несущественную задачу. Напротив - неспособность написать необходимый модульный тест - означает, что вы можете позволить ошибке проскользнуть через вашу сеть, что обычно является более серьезной проблемой.

4
ответ дан 14 December 2019 в 18:59
поделиться

Да, вам следует выполнить модульное тестирование любого класса, который может содержать ошибки. Для модульного тестирования вашего класса ValidationDecorator вы должны использовать имитацию или заглушку реализации IValidator.

1
ответ дан 14 December 2019 в 18:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: