Модульное тестирование шаблона декоратора - PullRequest
5 голосов
/ 11 июня 2010

Недавно я решил одну из своих проблем, используя шаблон декоратора. Все работает отлично, и все достаточно отделено (или я так думаю), что я могу провести модульное тестирование каждого допустимого поля в отдельности.

У меня вопрос, если NameValidator и AgeValidator оба проходят тесты для функций Validate () и IsValid () (abstract). Нужно ли мне еще тестировать мой класс ValidationDecorator (еще не создан)? ValidationDecorator будет отвечать за оформление моего валидатора каждым классом валидации.

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());
    }

Спасибо.

Ответы [ 2 ]

4 голосов
/ 12 июня 2010

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

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

1 голос
/ 11 июня 2010

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

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