【问题标题】:Unit testing the decorator pattern单元测试装饰器模式
【发布时间】:2011-03-02 18:24:26
【问题描述】:

我最近使用装饰器模式解决了我的一个问题。一切正常,一切都足够解耦(或者我认为),我可以分别对每个有效字段进行单元测试。

我的问题是,如果 NameValidator 和 AgeValidator 都通过了 Validate() 和 IsValid()(抽象)函数的测试。我还需要对我的 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());
    }

谢谢。

【问题讨论】:

    标签: c# unit-testing nunit


    【解决方案1】:

    经验法则是“测试所有可能破坏的东西”。现在,在现实生活中判断什么可能会被破坏绝非易事。需要实践和经验才能做到正确。而且不可能给出一般性的建议,尤其是在没有看到你的设计和代码的情况下。

    所以最后,只有你才能可靠地评估你是否有足够的信心,ValidationDecorator 如此微不足道,它永远不会崩溃。如果有疑问,最好在过多的测试方面犯错 :-) 这意味着您会在可能不重要的任务上花费一些额外的时间。相反 - 未能编写所需的单元测试 - 意味着您可能会让错误从您的网络中溜走,这通常是一个更大的问题。

    【讨论】:

      【解决方案2】:

      是的,您应该对任何可能包含错误的类进行单元测试。要对 ValidationDecorator 类进行单元测试,您应该使用 IValidator 的模拟或存根实现。

      【讨论】:

        猜你喜欢
        • 2016-12-30
        • 2016-08-20
        • 2012-04-26
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 2012-11-01
        • 2017-05-03
        相关资源
        最近更新 更多