как смоделировать исключение, выброшенное классом __construct

Представьте себе класс А, создающий класс Б.
Я пытаюсь написать тест для класса А и высмеивать поведение Б.

B может выдать какое-то исключение при инициализации, и это то, что я хочу поиграть с phpunit, чтобы правильно проверить A.

Можно ли издеваться над магической функцией? __construct каким-то образом?

0

Решение

Не с возможностью насмешки PHPUnit. Вам нужно будет переопределить класс в вашем тесте, чтобы B __construct бросает исключение. За исключением того, что это может привести к появлению ошибок позже, когда вы пытаетесь протестировать B или хотите, чтобы B действительно создавался из-за того, что класс уже определен. Эти трудности являются запахом кода в том, что ваш код разработан неоптимально.

Скорее, то, что вы должны делать, это передать B в A __construct метод. Это инъекция зависимости. Таким образом, вы создадите макет B и передадите его A. Это более понятно, потому что если B __construct выдает исключение, это проблема с B, а не A. В общем, вы должны избегать использования new внутри ваших объектов и вместо этого передавайте их (кроме случаев классов Factory).

1

Другие решения

Мое мнение, что вы плохо спроектировали свои классы, и контрольный пример класса всегда должен быть связан с самим классом: вы не должны проверять класс B в тесте для класса A.

PHPUnit не может реализовать тест такого типа, но вы можете использовать другую библиотеку (издевательство), это поможет вам проверить этот вид зависимостей. С Mockery вы можете сделать что-то вроде:

$mock = \Mockery::mock('MyClass');
$mock->shouldReceive('name_of_method_1')
->once()
->with($arg1)
->andReturn('return value');
1

По вопросам рекламы [email protected]