Laravel 8包中使用User模型进行功能测试的问题求助
解决Laravel包测试中用户模型工厂的问题
以下是几个可行的解决思路:
1. 为包的测试环境创建专属User模型和工厂
因为包的测试是独立运行的,不需要依赖主项目的User模型,直接在包内创建测试用的模型和工厂即可:
- 在包的
tests/Models目录下创建User.php:
<?php namespace Tests\Models; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { protected $table = 'users'; protected $fillable = ['name', 'email', 'password']; }
- 在包的
database/factories目录下创建UserFactory.php,指向这个测试模型:
<?php namespace Database\Factories; use Tests\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; class UserFactory extends Factory { protected $model = User::class; public function definition() { return [ 'name' => $this->faker->name(), 'email' => $this->faker->unique()->safeEmail(), 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), ]; } }
- 在测试类中,覆盖包的配置,指定使用测试模型:
<?php namespace Tests\Feature; use Tests\Models\User; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ExampleTest extends TestCase { use RefreshDatabase; protected function setUp(): void { parent::setUp(); // 覆盖配置中的用户模型 config()->set('laravel-tournaments.user.model', User::class); } public function test_example() { $user = User::factory()->create(); // 执行测试逻辑 } }
- 别忘了在包的测试迁移中创建
users表(如果还没有),在database/migrations目录下添加创建users表的迁移文件即可。
2. 利用模型绑定动态替换
在包的测试启动流程中,将配置中指定的User模型绑定到测试用模型:
- 先创建测试用的
Tests\Models\User模型(同上) - 在测试的
setUp方法或者包的测试服务提供者中进行绑定:
protected function setUp(): void { parent::setUp(); // 将配置中的用户模型绑定到测试模型 $this->app->bind( config('laravel-tournaments.user.model'), \Tests\Models\User::class ); }
这样在测试过程中,包的代码调用配置中的User模型时,实际会使用测试用的模型,配合对应的工厂就能正常生成数据。
3. 调整包的配置默认值,支持测试环境
可以在包的默认配置文件中,根据环境动态设置用户模型:
// config/laravel-tournaments.php 'user' => [ 'table' => 'users', 'primary_key' => 'id', 'foreign_key' => 'user_id', 'model' => app()->environment('testing') ? \Tests\Models\User::class : App\Models\User::class, ],
这种方式能让默认配置自动适配测试场景,无需在测试类中手动覆盖配置。
内容的提问来源于stack exchange,提问作者Juliatzin
相关产品推荐
相关产品推荐

