在扩展包的单元测试中使用 Laravel Eloquent ORM
经过评论指正,这篇别看了。 不如直接去看官方文档扩展包开发
这一小节. 扩展包开发《Laravel 10 中文文档》
自己写的一个扩展包中使用了 Laravel Eloquent ORM 作为包数据的模型。在扩展包写单元测试时,扩展包的模型需要在扩展包装到 laravel 中才能使用, 否则会因为框架没有初始化,连不上数据库。但是正常逻辑, 扩展包肯定是测试好再装到项目中, 而不是先装到项目里,然后再进行开发和测试。所以特意解决了一下。
试着运行了一下, 报 Error : Call to a member function connection() on null 的错误。
然后直接点过去,发现Model基类提供了 setConnectionResolver
方法。setConnectionResolver
方法需要传入一个实现了 \Illuminate\Database\ConnectionResolverInterface
接口的实例。
剩下的事情就更简单了,找到 ConnectionResolverInterface
的实现 Illuminate\Database\ConnectionResolver
然后创建实例就好。
最后贴一下完整代码:
<?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());
}
}
}
可以看到现在扩展包已经能连上数据库并执行写入操作了。
本作品采用《CC 协议》,转载必须注明作者和本文链接
github.com/orchestral/testbench