单元测试参数抽象工厂
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
?如果我想测试它,不可避免地应该实例化 AppleFactory
或 SamsungFactory
的实例;这意味着如果要通过测试,则必须始终假定构建两个工厂是真实的。否则,测试范围跨越两个工厂是不好的。
我认为您对单元测试的定义过于武断。
最终,工厂 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 展示的 行为 并以这样的方式执行此操作,如果实现发生变化,您的测试将不必进行。无论是现在还是将来,你都会让你的生活轻松很多。
考虑以下设计:
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
的实例;这意味着如果要通过测试,则必须始终假定构建两个工厂是真实的。否则,测试范围跨越两个工厂是不好的。
我认为您对单元测试的定义过于武断。
最终,工厂 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 展示的 行为 并以这样的方式执行此操作,如果实现发生变化,您的测试将不必进行。无论是现在还是将来,你都会让你的生活轻松很多。