Ну вы не можете издеваться над конструктором. Вместо этого вам нужно немного изменить свой производственный код. Как я могу догадаться из описания, у вас есть что-то вроде этого:
class Foo {
public function bar(){
$bar = new ProgressBar($output, $size);
}
}
class ProgressBar{
public function __construct($output, $size){
$this->output = $output;
$this->size = $size;
}
}
Это не лучший код в мире, потому что у нас есть двойная зависимость. (Что совершенно нормально, например, если ProgressBar
является объектом значения).
Прежде всего вам следует протестировать ProgressBar
отдельно от Foo
. Поскольку тогда вы проверяете Foo
, вам не нужно заботиться о том, как ProgressBar
работает. Вы знаете, что это работает, у вас есть тесты для этого.
Но если вы все еще хотите протестировать его создание (по любой причине), есть два способа. Для обоих способов вам нужно извлечь new ProggresBar
class Foo {
public function bar(){
$bar = $this->getBar($output, $size);
}
public function getBar($output, $size){
return new ProgressBar($output, $size)
}
}
Способ 1:
class FooTest{
public function test(){
$foo = new Foo();
$this->assertInstanceOf(ProgressBar::class, $foo->getBar(\Mockery::type(OutputInterface::class), 3));
}
}
Способ 2:
class FooTest{
public function test(){
$mock = \Mockery::mock(Foo::class)->makePartial();
$mock->shouldReceive('getBar')
->with(\Mockery::type(OutputInterface::class), 3)
->once();
}
}
Удачного тестирования!
person
Alexander Matrosov
schedule
29.12.2017
return new ProgressBar(...func_get_args())
. Поэтому мне было интересно, можно ли эту практику протестировать с помощью Mockery. Я посмотрю на AspectMock. - person VaclavSir   schedule 04.06.2015Class TestProgressBar Extends ProgrssBar{ public function __construct( ... ){ assert };
- person Tony Chiboucas   schedule 27.10.2017