You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:02:47