我想模拟使用静态方法创建的类</p>
// this is how I instanciate the object
MyClass::from(AnotherClass $data);
// this is how the class looks like
class MyClass
{
protected function __construct(AnotherClass $data)
{
// do stuff
}
public static function from(AnotherClass $data): self
{
return new self($data);
}
}
这就是我将其绑定(bind)到容器的方式:
$this->app->bind(MyClass::class, function ($app, array $parameters) {
return MyClass::from($parameters[0]);
});
这就是我使用该类的方式
$data = new AnotherClass()
app(MyClass::class, [$data])
我无法全局存储 $data
来删除绑定(bind)中的参数。
问题是,当我尝试模拟或监视 MyClass
时,它不起作用。
$spy = spy(MyClass::class);
// ... do some stuff
$spy->shouldHaveReceived('reactPHPIdle');
如果我转储app(MyClass::class)
,则会返回模拟类。但是,当我转储 app(MyClass::class, [$data])
时,将返回原始类,而不是模拟的类。
如何成功模拟我的类(class)?有没有更好的方法来做到这一点(例如重构类)?
最佳答案
模拟或 spy 事件会在容器中注册一个实例。当解析时提供参数时,容器不会获取该实例,而是使用绑定(bind)函数创建一个新实例。
要解决此问题,您可以覆盖测试中的绑定(bind)函数以返回 spy 。例如:
app()->bind(MyClass::class, function () use ($spy) {
return $spy;
});
关于php - 如何使用参数模拟容器解析的类? - 拉维尔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71410311/