考虑以下设计:
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
?如果我想测试它,不可避免地要实例化AppleFactory
或SamsungFactory
的实例;这意味着如果要通过测试,那么构建两个工厂必须始终被认为是真实的。否则,测试范围跨越两个不好的工厂。
答案 0 :(得分:1)
我认为你对单元测试的定义太过教条了。
最后,工厂类的工作是生成类的实例。为了测试它必须创建其他类。
单元测试不一定测试单个类,而是unit of functionality or behavior(不是链接书的创作时间并不是说它测试一个类,而是一个逻辑概念:
可以跨越单个方法,整个类或多个类一起工作以实现可以验证的单个逻辑目的。
)。这可能涉及几个类。否则将以非常脆弱的测试结束,每次重构代码时都必须更改,测试试图模拟或存根与另一个类的每次交互,这最终会跳过荒谬的箍(正如你在这里尝试的那样)
务实。测试您希望您的课程展示的行为,并以尽可能实现更改您的测试的方式执行此操作。无论现在还是将来,你都会让生活变得更轻松。