单元测试参数抽象工厂

Unit Test Parametric 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 的实例;这意味着如果要通过测试,则必须始终假定构建两个工厂是真实的。否则,测试范围跨越两个工厂是不好的。

我认为您对单元测试的定义过于武断。

最终,工厂 class 的工作是生产 class 的实例。为了测试它必须创建另一个 class.

单元测试不一定测试单个 class,而是 unit of functionality or behavior(不是所链接的书的作者并没有说它测试一个 class,而是一个逻辑其中的概念:

can span a single method, a whole class or multiple classes working together to achieve one single logical purpose that can be verified`

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

务实。尽可能地测试您希望 class 展示的 行为 并以这样的方式执行此操作,如果实现发生变化,您的测试将不必进行。无论是现在还是将来,你都会让你的生活轻松很多。