Рассмотрим следующую конструкцию:Unit Test Параметрический 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
; это означает, что если тест должен быть принят, необходимо, чтобы построение обеих заводов всегда считалось истинным. В противном случае тестовая область охватывает две фабрики, что не очень хорошо.
В чем проблема с возвратом фактического экземпляра? конечно, ваш тест хочет в основном проверить, что, когда строка «Samsung» возвращает «IPhoneFactory», является экземпляром «SamsungFactory»? Как еще вы собираетесь его протестировать? –
@SamHolder Проблема заключается в том, что таким образом проверяется не только «PhoneAbstractFactory», но и «SamsungFactory». Это не ** unit ** test – Hans
@Hans, imho, это не совсем так, вы, конечно же, проверяете, что завод получает вам правильный тип объекта. Таким образом, неявно этот объект будет создан, но он не проверяет логику фабрики, вы можете делать абсурдные вещи в конструкторе, тест пройдет, пока не будет никакого исключения. –