在扩展包的单元测试中使用 Laravel Eloquent ORM

经过评论指正,这篇别看了。 不如直接去看官方文档扩展包开发这一小节. 扩展包开发《Laravel 10 中文文档》

自己写的一个扩展包中使用了 Laravel Eloquent ORM 作为包数据的模型。在扩展包写单元测试时,扩展包的模型需要在扩展包装到 laravel 中才能使用, 否则会因为框架没有初始化,连不上数据库。但是正常逻辑, 扩展包肯定是测试好再装到项目中, 而不是先装到项目里,然后再进行开发和测试。所以特意解决了一下。

试着运行了一下, 报 Error : Call to a member function connection() on null 的错误。

在扩展包的单元测试中使用 Laravel Eloquent ORM

然后直接点过去,发现Model基类提供了 setConnectionResolver 方法。setConnectionResolver 方法需要传入一个实现了 \Illuminate\Database\ConnectionResolverInterface 接口的实例。

剩下的事情就更简单了,找到 ConnectionResolverInterface 的实现 Illuminate\Database\ConnectionResolver 然后创建实例就好。

在扩展包的单元测试中使用 Laravel Eloquent ORM

最后贴一下完整代码:

<?php

namespace Sollado\Filesystem;

use Illuminate\Database\Connection;
use Illuminate\Database\ConnectionResolver;
use Illuminate\Database\Eloquent\Model;
use PDO;
use PDOException;


const IS_TEST = true;
/**
 * @method static create(array $array)
 */
class FilesystemModel extends Model
{


    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);

        if(IS_TEST){
            $this->makeConnection();
        }
    }

    private function makeConnection()
    {
        $host = '127.0.0.1';
        $dbname = 'tests';
        $user = 'test_user';
        $password = 'test_password';

        $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4";

        try {
            $pdo = new PDO($dsn, $user, $password);
            $connectionResolver = new ConnectionResolver(['mysql' => new Connection($pdo)]);
            $connectionResolver->setDefaultConnection('mysql');
            $this->setConnectionResolver($connectionResolver);
        } catch (PDOException $e) {
            die('Connection failed: ' . $e->getMessage());
        }
    }
}

可以看到现在扩展包已经能连上数据库并执行写入操作了。
在扩展包的单元测试中使用 Laravel Eloquent ORM

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 8
1年前 评论
徵羽宫 (楼主) 1年前
徵羽宫 (楼主) 1年前
guanguans (作者) 1年前
徵羽宫 (楼主) 1年前
徵羽宫 (楼主) 1年前
guanguans (作者) 1年前
徵羽宫 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!