2016-10-06 3 views
0

Как описано here, можно создать пользовательские Type s.Как тестировать пользовательские типы Doctrine

Я сделал это, но сейчас я хочу протестировать класс, но, к сожалению, это невозможно.

Infact, пользовательский тип расширяет класс Doctrine\DBAL\Types\Type, который, кажется, не может быть создан.

Infact, его конструктор построен таким образом:

/** 
* Prevents instantiation and forces use of the factory method. 
*/ 
final private function __construct() 
{ 
} 

Как сказано в комментарии, необходимо использовать фабричный метод для создания экземпляра класса, но, то, что этот метод является завод? Где я могу найти его?

+0

вы могли бы взглянуть на DBAL тестов, в качестве примера см этого теста https://github.com/doctrine/dbal/blob/master/tests/Doctrine/Tests/DBAL/Types/DecimalTest. php – Matteo

+0

Ммм ... Кажется, «Doctrine \ Tests \ DBAL \ Mocks \ MockPlatform» является необоснованным! -.- ' – Aerendir

+0

Они упоминают об этом [здесь] (https://github.com/ramsey/uuid/issues/16#issuecomment-24575462), но я не уверен, как они сломали его. – mickadoo

ответ

0

Через комбинацию not replacing any methods в макете и some tips из вопроса о github. Я смог сделать единичный тест для типа доктрины. Я думаю, это работает для более простых типов, где платформа не имеет отношения к делу. Для более сложного типа поведения вы можете заменить платформу другим макетом.

/** 
* @test 
*/ 
public function willCastValueToInt() 
{ 
    $typeBuilder = $this 
     ->getMockBuilder(IntegerType::class) 
     ->disableOriginalConstructor() 
     ->setMethods(null); 

    $type = $typeBuilder->getMock(); 
    $platform = $this->getMockForAbstractClass(AbstractPlatform::class); 

    $result = $type->convertToPHPValue('3', $platform); 

    $this->assertSame(3, $result); 
}