0

我试图让我的 PHP 代码更容易测试。这是一个场景。我有一个client对象。该client对象具有全部对应于数据库表中的字段的属性。为了更完整地描述client对象,我想添加一个调用licensees()到我的client对象模型的方法。

过去,我可能在我的客户端模型中将其设为静态方法……如下所示:

public static function licensees($id)
{
    $licensees = static::query()
        ->where('id', $id)
        ->related('categories', array('where' => array(array('group', '=', 30))))
        ->get();

    return $licensees;
}

这种方法有一些我不喜欢的含义,其中最重要的是您可以传入任何内容$id并获得结果,无论是否在权限$id范围内。client

对我来说,更安全的方法是实现一个考虑client对象范围的非静态方法:

public function licensees()
{
    $licensees = $this->query()
        ->where('id', $this->id)
        ->related('categories', array('where' => array(array('group', '=', 30))))
        ->get();

    return $licensees;
}

认为这在可用性和安全性方面是一个更好的解决方案,但我真的看不出它比静态方法更具可测试性。事实上,由于using的单例含义,它看起来不太可测试。我最近读了很多关于测试驱动开发和使用依赖注入作为控制反转的形式,我正在尝试实现它:$this

public function licensees(Client $client)
{
    $licensees = $client->query()
        ->where('id', $client->id)
        ->related('categories', array('where' => array(array('group', '=', 30))))
        ->get();

    return $licensees;
}

对我来说,这实际上看起来是可测试的,因为它可以让我在运行测试时轻松发送mockClient而不是真正的客户端。我是否正确理解了这个概念?

$client在这种情况下将对象传递给 似乎有点多余model,因为它model本身具有$this上下文。但是,我相信$this对象模型中对上下文的依赖会抑制可测试性。这是一个有效的陈述,还是我在这里偏离了基地?

4

0 回答 0