【问题标题】:Eloquent testing models雄辩的测试模型
【发布时间】:2013-05-22 18:19:21
【问题描述】:

我正在编写一个使用 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 并仅在需要时加载其余部分。有什么办法吗?

【问题讨论】:

    标签: php orm laravel eloquent


    【解决方案1】:

    这里的原则就像在所有测试中一样。在代码中直接在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);
        }
    }
    

    Setter 注入

    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);
    

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

    【讨论】:

    • 我想到了构造函数的解决方案,但这违背了我的课程计划。完全忘记了二传手的方式。谢谢。
    猜你喜欢
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2015-08-15
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多