Laravel不依赖数据库SQL查询测试

1. 运行环境

linux

1). 当前使用的 Laravel 版本?

Laravel 9

2). 当前使用的 php/php-fpm 版本?

PHP 版本:8.1

php-fpm 版本:8.1

4). 业务环境

phpunit test

2. 问题描述?

现在有一个需求是,我想测试查询生成的SQL是否正确,但是又不想依赖数据库。Laravel 现有的方案并没有现成的方案。我这边想了一个折中的方案,测试的时候给一个空地址(不能正常的连接数据库),在查询的时候捕获 QueryException 异常,然后拿到其中的查询语句。感觉这个方法比较笨重,看看大家有没有比较好的方案。
代码示例:

class UserRepository
{
    public function getByMobile()
    {
        return User::where('status', 1)
            ->where('mobile', 'like', '1111%')
            ->get();
    }
}

现在如果我想测试getByMobile()方法,没有一个很好的办法来处理。或者说这时候不应该对这个方法进行测试。

aab
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
leo
最佳答案

还是我来吧……

DB::pretend(function (): void {
    \App\User::first();
});
2年前 评论
aab (楼主) 2年前
guanguans 2年前
讨论数量: 6
leo

还是我来吧……

DB::pretend(function (): void {
    \App\User::first();
});
2年前 评论
aab (楼主) 2年前
guanguans 2年前

想要捕获sql又不想真正执行可以利用事务回滚来实现

2年前 评论

试下

User::where('status', 1)
            ->where('mobile', 'like', '1111%')
            ->dump()
            ->get();
2年前 评论
leo

还是我来吧……

DB::pretend(function (): void {
    \App\User::first();
});
2年前 评论
aab (楼主) 2年前
guanguans 2年前

是不是可以使用

(new Topic())->where('id',1)->dd();

file

2年前 评论

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