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
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
leo
最佳答案

还是我来吧……

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

还是我来吧……

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

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

1年前 评论

试下

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

还是我来吧……

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

是不是可以使用

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

file

1年前 评论

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