Представьте себе класс А, создающий класс Б.
Я пытаюсь написать тест для класса А и высмеивать поведение Б.
B может выдать какое-то исключение при инициализации, и это то, что я хочу поиграть с phpunit, чтобы правильно проверить A.
Можно ли издеваться над магической функцией? __construct
каким-то образом?
Не с возможностью насмешки PHPUnit. Вам нужно будет переопределить класс в вашем тесте, чтобы B __construct
бросает исключение. За исключением того, что это может привести к появлению ошибок позже, когда вы пытаетесь протестировать B или хотите, чтобы B действительно создавался из-за того, что класс уже определен. Эти трудности являются запахом кода в том, что ваш код разработан неоптимально.
Скорее, то, что вы должны делать, это передать B в A __construct
метод. Это инъекция зависимости. Таким образом, вы создадите макет B и передадите его A. Это более понятно, потому что если B __construct
выдает исключение, это проблема с B, а не A. В общем, вы должны избегать использования new
внутри ваших объектов и вместо этого передавайте их (кроме случаев классов Factory).
Мое мнение, что вы плохо спроектировали свои классы, и контрольный пример класса всегда должен быть связан с самим классом: вы не должны проверять класс B в тесте для класса A.
PHPUnit не может реализовать тест такого типа, но вы можете использовать другую библиотеку (издевательство), это поможет вам проверить этот вид зависимостей. С Mockery вы можете сделать что-то вроде:
$mock = \Mockery::mock('MyClass');
$mock->shouldReceive('name_of_method_1')
->once()
->with($arg1)
->andReturn('return value');