确保您已通过身份验证,以便在您的 TestCase 中访问应用:
use App\Models\User;
protected function setUp(): void
{
parent::setUp();
$this->actingAs(User::factory()->create());
}或者,如果您正在使用 Pest 您可以使用 beforeEach() 函数在您的测试文件的顶部进行身份验证:
use App\Models\User;
beforeEach(function () {
$user = User::factory()->create();
actingAs($user);
});要测试列表页面是否能够加载,请将列表页面作为 Livewire 组件进行测试,并调用 assertOk() 以确保 HTTP 响应为 200 OK。您还可以使用 assertCanSeeTableRecords() 方法来检查记录是否正在表格中显示:
use App\Filament\Resources\Users\Pages\ListUsers;
use App\Models\User;
it('can load the page', function () {
$users = User::factory()->count(5)->create();
livewire(ListUsers::class)
->assertOk()
->assertCanSeeTableRecords($users);
});要测试列表页上的表格,您应该访问测试表格部分。要测试页面标题中的任何操作或表格中的操作,您应该访问测试操作部分。以下是一些您可以在列表页上运行的其他常见测试示例。
要 测试表格搜索功能是否正常工作,您可以使用 searchTable() 方法来搜索特定记录。您还可以使用 assertCanSeeTableRecords() 和 assertCanNotSeeTableRecords() 方法来检查表格中是否显示了正确的记录:
use App\Filament\Resources\Users\Pages\ListUsers;
use App\Models\User;
it('can search users by `name` or `email`', function () {
$users = User::factory()->count(5)->create();
livewire(ListUsers::class)
->assertCanSeeTableRecords($users)
->searchTable($users->first()->name)
->assertCanSeeTableRecords($users->take(1))
->assertCanNotSeeTableRecords($users->skip(1))
->searchTable($users->last()->email)
->assertCanSeeTableRecords($users->take(-1))
->assertCanNotSeeTableRecords($users->take($users->count() - 1));
});要测试表格排序是否正常工作,您可以使用sortTable() 方法按特定列对表格进行排序。您还可以使用assertCanSeeTableRecords() 方法来检查记录是否按正确顺序显示:
use App\Filament\Resources\Users\Pages\ListUsers;
use App\Models\User;
it('can sort users by `name`', function () {
$users = User::factory()->count(5)->create();
livewire(ListUsers::class)
->assertCanSeeTableRecords($users)
->sortTable('name')
->assertCanSeeTableRecords($users->sortBy('name'), inOrder: true)
->sortTable('name', 'desc')
->assertCanSeeTableRecords($users->sortByDesc('name'), inOrder: true);
});为了 测试表格过滤功能是否正常工作,您可以使用 filterTable() 方法按特定列过滤表格。您还可以使用 assertCanSeeTableRecords() 和 assertCanNotSeeTableRecords() 方法来检查表格中是否显示了正确的记录:
use App\Filament\Resources\Users\Pages\ListUsers;
use App\Models\User;
it('can filter users by `locale`', function () {
$users = User::factory()->count(5)->create();
livewire(ListUsers::class)
->assertCanSeeTableRecords($users)
->filterTable('locale', $users->first()->locale)
->assertCanSeeTableRecords($users->where('locale', $users->first()->locale))
->assertCanNotSeeTableRecords($users->where('locale', '!=', $users->first()->locale));
});要测试表格批量操作是否正常工作,你可以使用selectTableRecords()方法来选择表格中的多条记录。你还可以使用callAction()方法对所选记录调用特定操作:
use App\Filament\Resources\Users\Pages\ListUsers;
use App\Models\User;
use Filament\Actions\Testing\TestAction;
use function Pest\Laravel\assertDatabaseMissing;
it('can bulk delete users', function () {
$users = User::factory()->count(5)->create();
livewire(ListUsers::class)
->assertCanSeeTableRecords($users)
->selectTableRecords($users)
->callAction(TestAction::make(DeleteBulkAction::class)->table()->bulk())
->assertNotified()
->assertCanNotSeeTableRecords($users);
$users->each(fn (User $user) => assertDatabaseMissing($user));
});为了测试创建页面是否能够加载,将创建页面作为 Livewire 组件进行测试,并调用 assertOk() 以确保 HTTP 响应为 200 OK:
use App\Filament\Resources\Users\Pages\CreateUser;
use App\Models\User;
it('can load the page', function () {
livewire(CreateUser::class)
->assertOk();
});要测试创建页面上的表单,你应该访问 测试模式 部分。要测试页面标题或表单中的任何操作,你应该访问 测试操作 部分。下面是一些你可以在创建页面上运行的其他常见测试示例。
为测试表单是否正确创建了记录,你可以使用 fillForm() 方法填写表单字段,然后使用 call('create') 方法创建记录。你还可以使用 assertNotified() 方法检查是否显示了通知,以及使用 assertRedirect() 方法检查用户是否被重定向到另一个页面:
use App\Filament\Resources\Users\Pages\CreateUser;
use App\Models\User;
use function Pest\Laravel\assertDatabaseHas;
it('can create a user', function () {
$newUserData = User::factory()->make();
livewire(CreateUser::class)
->fillForm([
'name' => $newUserData->name,
'email' => $newUserData->email,
])
->call('create')
->assertNotified()
->assertRedirect();
assertDatabaseHas(User::class, [
'name' => $newUserData->name,
'email' => $newUserData->email,
]);
});为了测试表单是否正确验证,你可以使用 fillForm() 方法填充表单字段,然后使用 call('create') 方法创建记录。你还可以使用 assertHasFormErrors() 方法检查表单是否有任何错误,以及使用 assertNotNotified() 方法检查是否没有显示通知。你还可以使用 assertNoRedirect() 方法检查用户是否未被重定向到其他页面。在此示例中,我们使用 Pest 数据集 来测试多个规则,而无需重复测试代码:
use App\Filament\Resources\Users\Pages\CreateUser;
use App\Models\User;
use Illuminate\Support\Str;
it('validates the form data', function (array $data, array $errors) {
$newUserData = User::factory()->make();
livewire(CreateUser::class)
->fillForm([
'name' => $newUserData->name,
'email' => $newUserData->email,
...$data,
])
->call('create')
->assertHasFormErrors($errors)
->assertNotNotified()
->assertNoRedirect();
})->with([
'`name` is required' => [['name' => null], ['name' => 'required']],
'`name` is max 255 characters' => [['name' => Str::random(256)], ['name' => 'max']],
'`email` is a valid email address' => [['email' => Str::random()], ['email' => 'email']],
'`email` is required' => [['email' => null], ['email' => 'required']],
'`email` is max 255 characters' => [['email' => Str::random(256)], ['email' => 'max']],
]);为了测试编辑页面是否能够加载,将编辑页面作为 Livewire 组件进行测试,并调用 assertOk() 来确保 HTTP 响应为 200 OK。你还可以使用 assertSchemaStateSet() 方法来检查表单字段是否设置了正确的值:
use App\Filament\Resources\Users\Pages\EditUser;
use App\Models\User;
it('can load the page', function () {
$user = User::factory()->create();
livewire(EditUser::class, [
'record' => $user->id,
])
->assertOk()
->assertSchemaStateSet([
'name' => $user->name,
'email' => $user->email,
]);
});要测试编辑页面上的表单,你应该访问 测试模式 部分。要测试页面标题或表单中的任何操作,你应该访问 测试操作 部分。下面是你可以在编辑页面上运行的其他一些常见测试的示例。
use App\Filament\Resources\Users\Pages\EditUser;
use App\Models\User;
use function Pest\Laravel\assertDatabaseHas;
it('can update a user', function () {
$user = User::factory()->create();
$newUserData = User::factory()->make();
livewire(EditUser::class, [
'record' => $user->id,
])
->fillForm([
'name' => $newUserData->name,
'email' => $newUserData->email,
])
->call('save')
->assertNotified();
assertDatabaseHas(User::class, [
'id' => $user->id,
'name' => $newUserData->name,
'email' => $newUserData->email,
]);
});为了测试表单是否正确验证,您可以使用 fillForm() 方法填写表单字段,然后使用 call('save') 方法保存记录。您还可以使用 assertHasFormErrors() 方法检查表单是否有任何错误,以及 assertNotNotified() 方法检查是否没有显示通知。在此示例中,我们使用一个 Pest 数据集 来测试多个规则,而无需重复测试代码:
use App\Filament\Resources\Users\Pages\EditUser;
use App\Models\User;
use Illuminate\Support\Str;
it('validates the form data', function (array $data, array $errors) {
$user = User::factory()->create();
$newUserData = User::factory()->make();
livewire(EditUser::class, [
'record' => $user->id,
])
->fillForm([
'name' => $newUserData->name,
'email' => $newUserData->email,
...$data,
])
->call('save')
->assertHasFormErrors($errors)
->assertNotNotified();
})->with([
'`name` is required' => [['name' => null], ['name' => 'required']],
'`name` is max 255 characters' => [['name' => Str::random(256)], ['name' => 'max']],
'`email` is a valid email address' => [['email' => Str::random()], ['email' => 'email']],
'`email` is required' => [['email' => null], ['email' => 'required']],
'`email` is max 255 characters' => [['email' => Str::random(256)], ['email' => 'max']],
]);要测试某个操作是否有效,例如DeleteAction,您可以使用callAction()方法来调用删除操作。您还可以使用assertNotified()方法来检查通知是否已显示,以及assertRedirect()方法来检查用户是否被重定向到另一个页面:
use App\Filament\Resources\Users\Pages\EditUser;
use App\Models\User;
use Filament\Actions\DeleteAction;
use function Pest\Laravel\assertDatabaseMissing;
it('can delete a user', function () {
$user = User::factory()->create();
livewire(EditUser::class, [
'record' => $user->id,
])
->callAction(DeleteAction::class)
->assertNotified()
->assertRedirect();
assertDatabaseMissing($user);
});为了测试视图页面是否能够加载,将视图页面作为 Livewire 组件进行测试,并调用 assertOk() 以确保 HTTP 响应为 200 OK。您还可以使用 assertSchemaStateSet() 方法来检查信息列表条目是否已设置为正确的值:
use App\Filament\Resources\Users\Pages\ViewUser;
use App\Models\User;
it('can load the page', function () {
$user = User::factory()->create();
livewire(ViewUser::class, [
'record' => $user->id,
])
->assertOk()
->assertSchemaStateSet([
'name' => $user->name,
'email' => $user->email,
]);
});为了测试查看页面上的信息列表,您应该访问 测试模式 部分。为了测试页面头部或信息列表中的任何操作,您应该访问 测试操作 部分。
为了测试关系管理器是否在页面(例如资源的编辑页面)上被渲染,你可以使用 assertSeeLivewire() 方法来检查关系管理器是否正在被渲染:
use App\Filament\Resources\Users\Pages\EditUser;
use App\Filament\Resources\Users\RelationManagers\PostsRelationManager;
use App\Models\User;
it('can load the relation manager', function () {
$user = User::factory()->create();
livewire(EditUser::class, [
'record' => $user->id,
])
->assertSeeLivewire(PostsRelationManager::class);
});由于关系管理器是 Livewire 组件,你也可以测试关系管理器本身的功能,例如它能否以 200 OK 响应成功加载,以及表中是否包含正确的记录。在测试关系管理器时,你需要传入 ownerRecord,它是你所处资源中的记录,以及 pageClass,它是你所处页面的类:
use App\Filament\Resources\Users\Pages\EditUser;
use App\Filament\Resources\Users\RelationManagers\PostsRelationManager;
use App\Models\Post;
use App\Models\User;
it('can load the relation manager', function () {
$user = User::factory()
->has(Post::factory()->count(5))
->create();
livewire(PostsRelationManager::class, [
'ownerRecord' => $user,
'pageClass' => EditUser::class,
])
->assertOk()
->assertCanSeeTableRecords($user->posts);
});您可以测试搜索,排序,和筛选 以与在资源列表页面上相同的方式。
你也可以测试操作, 例如,CreateAction在表的标题中:
use App\Filament\Resources\Users\Pages\EditUser;
use App\Filament\Resources\Users\RelationManagers\PostsRelationManager;
use App\Models\Post;
use App\Models\User;
use Filament\Actions\Testing\TestAction;
use function Pest\Laravel\assertDatabaseHas;
it('can create a post', function () {
$user = User::factory()->create();
$newPostData = Post::factory()->make();
livewire(PostsRelationManager::class, [
'ownerRecord' => $user,
'pageClass' => EditUser::class,
])
->callAction(TestAction::make(CreateAction::class)->table(), [
'title' => $newPostData->title,
'content' => $newPostData->content,
])
->assertNotified();
assertDatabaseHas(Post::class, [
'title' => $newPostData->title,
'content' => $newPostData->content,
'user_id' => $user->id,
]);
});getFormActions()当在 getFormActions() 的资源页面上测试操作时,使用 schemaComponent() 方法,目标是 form-actions 键。例如,如果你在 getFormActions() 方法中,针对你的 CreateUser 页面,有一个自定义的 Action::make('createAndVerifyEmail') 操作,你可以这样测试它:
use App\Filament\Resources\Users\Pages\CreateUser;
use App\Models\User;
use Filament\Actions\Testing\TestAction;
it('can create a user and verify their email address', function () {
livewire(CreateUser::class)
->fillForm([
'name' => 'Test User',
'email' => 'test@example.com',
])
->callAction(TestAction::make('createAndVerifyEmail')->schemaComponent('form-actions'));
expect(User::query()->where('email', 'test@example.com')->first())
->hasVerifiedEmail()->toBeTrue();
});如果你有多个面板,并且想要测试一个非默认面板,你需要告诉 Filament 你正在测试哪个面板。这可以在测试用例的 setUp() 方法中完成,或者你可以在特定测试的开始时进行。Filament 通常在你通过请求访问面板时在中间件中执行此操作,因此如果你的测试中没有发出请求,例如在测试 Livewire 组件时,你需要手动设置当前面板:
use Filament\Facades\Filament;
Filament::setCurrentPanel('app'); // Where `app` is the ID of the panel you want to test.