0

我正在编写一个使用 Laravel 的 Eloquent ORM 的类(我没有使用整个框架)。

由于某些原因,我比其他 ORM 更喜欢 Eloquent,但是,我很难弄清楚如何测试一些东西。

例子:

public function getTitle()
{
    $this->loadModel();

    return $this->blogModel->title;
}


private function loadModel()
{
    if($this->blogModel) {
        return;
    }

    $this->blogModel = BlogModel::find($this->id);
}

我想模拟BlogModel::find($this->id); 和测试,它只被调用一次。(或不采取任何行动时没有)。

类的重点是只需要博客的 ID 并仅在需要时加载其余部分。有什么办法吗?

4

1 回答 1

0

这里的原则就像在所有测试中一样。在代码中直接调用静态函数BlogModel取决于编写测试时不好的类。您希望将依赖项注入到您的类中,以便您可以单独测试您的类。您可以通过两种方式执行此操作(除非使用依赖注入容器),要么使用构造函数注入,要么使用 setter 注入它们。

构造函数注入

class SomeClass
{
    private $blogModelClass;

    public function __construct(BlogModel $blogModelClass) 
    {
        $this->blogModelClass = $blogModel;
    }

    private function loadModel()
    {
        if($this->blogModel) {
            return;
        }

        $this->blogModel = $this->blogModelClass->find($this->id);
    }
}

二传手注入

class SomeClass
{
    private $blogModelClass;

    public function setBlogModelClass(BlogModel $blogModelClass) 
    {
        $this->blogModelClass = $blogModel;
    }

    private function loadModel()
    {
        if($this->blogModel) {
            return;
        }

        $this->blogModel = $this->blogModelClass->find($this->id);
    }
}

测试

现在您可以在构造函数中注入依赖项或使用 getter,所以这些是您的选择

// Constructor injection
$someClass = new SomeClass(new BlogModel);

// Setter injection
$someClass = new SomeClass();
$someClass->setBlogModelClass(new BlogModel);

在编写测试时,您现在可以轻松地插入一个模拟对象并模拟它的响应。

于 2013-05-22T19:59:57.713 回答