发布于2026-07-19 阅读(0)
扫一扫,手机访问
Lara vel 单元测试中,数据库操作老是被自动回滚,这事儿其实挺常见的。根本原因呢,就是框架默认给每个测试方法都套了个事务,跑完就回滚,搞得你根本没法验证数据到底写没写进去。那怎么关掉这个自动回滚呢?下面这几种方法,应该能解决你的问题。

先说几个核心判断:如果你需要验证INSERT、UPDATE或者外键约束的实际效果,那事务回滚就必须关掉。具体怎么关,取决于你想控制的范围。
这是最直接的方法,直接关闭当前测试类里所有测试方法的事务包装,让数据库变更真实持久化。你只需要在测试类最顶部声明 protected $usesTransactions = false; 这就够了。当然,前提是测试类得继承自 Tests\TestCase 或其子类。这样一来,该类下所有 test* 方法运行的时候,都不会被事务包裹。
这种方法更精细,不会影响其他测试类的行为。你可以在测试类里重写 setUp() 方法,调用 $this->disableDatabaseTransactions();。需要注意的是,如果当前测试类已经用了 use DatabaseTransactions; trait,那得先把它注释掉或者移除,不然会有冲突。
如果你需要观察多次写入的累积状态,比如测试一个操作后数据递增了多少,那更推荐用 use RefreshDatabase;(Lara vel 8+ 推荐)或者 use DatabaseMigrations;(旧版本兼容)。这个方法会在每个测试前执行 migrate:fresh,但之后不回滚,数据会一直保留到测试结束。当然,别忘了确保测试数据库独立于开发/生产环境,避免污染。
如果只有个别测试需要绕过事务机制,那直接在方法内部操作就行。在测试方法开头调用 \DB::disableQueryLog();,然后手动关闭事务监听器:\Illuminate\Foundation\Testing\DatabaseTransactions::disable();。不过,操作完之后,如果你想恢复事务行为,需要在 tearDown() 里显式调用 enable 方法——但说实话,不太推荐这种混用,容易留坑。
如果你在CI环境里跑测试,需要统一控制,那这种方法最适合。在 phpunit.xml 的
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8