Laravel单元测试中使用Factory创建数据未保存,模型计数为0
解决Laravel测试中Factory创建数据后count为0的问题
排查步骤及解决方案
1. 确认测试类引入正确的数据库Trait
Laravel测试中,未正确引入数据库相关Trait会导致数据无法持久化到测试数据库。
确保测试类顶部引入Illuminate\Foundation\Testing\RefreshDatabase Trait:
use Illuminate\Foundation\Testing\RefreshDatabase; class StockTest extends TestCase { use RefreshDatabase; // 保证测试数据库自动迁移且数据隔离 public function test_stock_factory() { Stock::factory()->count(3)->create(); dd(Stock::count()); } }
RefreshDatabase会在每个测试前自动完成数据库迁移,测试结束后清理数据,确保测试环境的独立性。
2. 检查测试数据库配置
确认phpunit.xml中的数据库配置指向测试专用数据库,避免与开发/生产数据库混淆:
<php> <server name="DB_CONNECTION" value="sqlite"/> <server name="DB_DATABASE" value=":memory:"/> <!-- 内存数据库,高效且隔离性强 --> </php>
若使用MySQL等数据库,需确保测试数据库已创建、配置正确,可手动执行测试环境迁移验证:
php artisan migrate --env=testing
3. 排查模型全局作用域干扰
如果Stock模型使用了SoftDeletes Trait,检查是否有全局作用域过滤数据:
尝试查询包含软删除数据的总数,确认数据是否被意外标记为软删除:
Stock::factory()->count(3)->create(); dd(Stock::withTrashed()->count());
若返回3,说明模型存在自动软删除逻辑,需排查Factory或模型的相关代码。
4. 验证SQL执行日志
开启SQL日志,确认Factory是否执行了插入操作:
\DB::enableQueryLog(); Stock::factory()->count(3)->create(); dd(\DB::getQueryLog());
如果未看到INSERT语句,检查Factory的命名空间、模型关联是否正确;如果存在INSERT但COUNT返回0,确认SELECT语句的过滤条件是否异常。
5. 确认测试环境表结构正确
手动执行测试环境迁移,确保表结构与Factory字段匹配:
php artisan migrate --env=testing
若迁移失败,检查迁移文件中字段类型(如stock_qty的bigInteger)与Factory生成数据的兼容性。
内容的提问来源于stack exchange,提问作者Ibrahim
相关产品推荐
相关产品推荐

