我需要测试一下,代码会创建一个具有特定参数的类的新实例:
$bar = new ProgressBar($output, $size);
我尝试创建别名模拟并为__construct
方法设置期望,但它没有工作:
$progressBar = \Mockery::mock('alias:' . ProgressBar::class);
$progressBar->shouldReceive('__construct')
->with(\Mockery::type(OutputInterface::class), 3)
->once();
这种期望从未得到满足:Mockery\Exception\InvalidCountException: Method __construct(object(Mockery\Matcher\Type), 3) from Symfony\Component\Console\Helper\ProgressBar should be called exactly 1 times but called 0 times.
你知道如何用Mockery测试这个吗?
答案 0 :(得分:1)
嗯,你不能模拟构造函数。相反,您需要稍微修改您的生产代码。正如我可以从解密中猜出你有类似的东西:
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)
}
}
class FooTest{
public function test(){
$foo = new Foo();
$this->assertInstanceOf(ProgressBar::class, $foo->getBar(\Mockery::type(OutputInterface::class), 3));
}
}
class FooTest{
public function test(){
$mock = \Mockery::mock(Foo::class)->makePartial();
$mock->shouldReceive('getBar')
->with(\Mockery::type(OutputInterface::class), 3)
->once();
}
}
快乐测试!