单元测试参数抽象工厂

时间:2015-09-03 14:57:13

标签: unit-testing abstract-factory

考虑以下设计:

public class PhoneAbstractFactory
{
        public IPhoneFactory GetPhoneFactory(string type, bool needSmartPhone)
        {
            if (type == "Samsung")
                return new SamsungFactory(needSmartPhone);

            if (type == "Apple")
                return new AppleFactory(needSmartPhone);

            else throw new Exception("Unknown phone type: " + type);
        }
}

    public interface IPhoneFactory  { }

    public class SamsungFactory : IPhoneFactory
    {
        public SamsungFactory(bool needSmartPhone)
        {
        }
    }

    public class AppleFactory : IPhoneFactory
    {
        public AppleFactory(bool needSmartPhone)
        {
        }
    }

如何仅测试PhoneAbstactFactory?如果我想测试它,不可避免地要实例化AppleFactorySamsungFactory的实例;这意味着如果要通过测试,那么构建两个工厂必须始终被认为是真实的。否则,测试范围跨越两个不好的工厂。

1 个答案:

答案 0 :(得分:1)

我认为你对单元测试的定义太过教条了。

最后,工厂类的工作是生成类的实例。为了测试它必须创建其他类。

单元测试不一定测试单个类,而是unit of functionality or behavior(不是链接书的创作时间并不是说它测试一个类,而是一个逻辑概念:

  

可以跨越单个方法,整个类或多个类一起工作以实现可以验证的单个逻辑目的。

)。这可能涉及几个类。否则将以非常脆弱的测试结束,每次重构代码时都必须更改,测试试图模拟或存根与另一个类的每次交互,这最终会跳过荒谬的箍(正如你在这里尝试的那样)

务实。测试您希望您的课程展示的行为,并以尽可能实现更改您的测试的方式执行此操作。无论现在还是将来,你都会让生活变得更轻松。