php - 如何使用参数模拟容器解析的类? - 拉维尔

标签 php laravel testing mocking mockery

我想模拟使用静态方法创建的类<​​/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/

相关文章:

laravel - Laravel 中的 store() 和 storeAs() 函数有什么区别?

python - 如何在机器人框架中拼接多个测试文件

php - 使用 PHPUnit 断言正确顺序的 Laravel 测试

php - mysql_connect 无法通过 VPN 在服务器中工作

php - 在我的帐户中添加手机字段 > 在 Woocommerce 中编辑帐户

php - Laravel 获取关系计数,其中数据库中的字段设置为特定值

php - 错误异常 : Creating default object from empty value

mysql - 将此查询转换为 Eloquent

testing - 使用 paypal ipn 模拟器测试 subscr_payment

php - cakePHP发送的电子邮件,如何在变量中设置管理员电子邮件地址?