为确保表格组件渲染,请使用 assertSuccessful() Livewire 辅助函数:
use function Pest\Livewire\livewire;
it('can render page', function () {
livewire(ListPosts::class)
->assertSuccessful();
});为了测试显示了哪些记录,您可以使用 assertCanSeeTableRecords(),assertCanNotSeeTableRecords() 和 assertCountTableRecords():
use function Pest\Livewire\livewire;
it('cannot display trashed posts by default', function () {
$posts = Post::factory()->count(4)->create();
$trashedPosts = Post::factory()->trashed()->count(6)->create();
livewire(PostResource\Pages\ListPosts::class)
->assertCanSeeTableRecords($posts)
->assertCanNotSeeTableRecords($trashedPosts)
->assertCountTableRecords(4);
});如果你的表格使用分页,
assertCanSeeTableRecords()只会检查第一页的记录。要切换页面,请调用call('gotoPage', 2)。
如果您的表格使用
deferLoading(),您应该在assertCanSeeTableRecords()之前调用loadTable()。
为确保某个列被渲染,将列名传递给 assertCanRenderTableColumn():
use function Pest\Livewire\livewire;
it('can render post titles', function () {
Post::factory()->count(10)->create();
livewire(PostResource\Pages\ListPosts::class)
->assertCanRenderTableColumn('title');
});此辅助函数将获取此列的 HTML,并检查它是否存在于表中。
为测试某个列未被渲染,你可以使用 assertCanNotRenderTableColumn():
use function Pest\Livewire\livewire;
it('can not render post comments', function () {
Post::factory()->count(10)->create()
livewire(PostResource\Pages\ListPosts::class)
->assertCanNotRenderTableColumn('comments');
});这个辅助函数将断言此列的 HTML 在当前表中默认不显示。
要搜索该表格,调用 searchTable() 方法,并传入您的搜索查询。
然后你可以使用 assertCanSeeTableRecords() 来检查你过滤后的表格记录,并使用 assertCanNotSeeTableRecords() 来断言某些记录已不在表格中:
use function Pest\Livewire\livewire;
it('can search posts by title', function () {
$posts = Post::factory()->count(10)->create();
$title = $posts->first()->title;
livewire(PostResource\Pages\ListPosts::class)
->searchTable($title)
->assertCanSeeTableRecords($posts->where('title', $title))
->assertCanNotSeeTableRecords($posts->where('title', '!=', $title));
});要搜索单个列,您可以传入一个搜索数组给 searchTableColumns():
use function Pest\Livewire\livewire;
it('can search posts by title column', function () {
$posts = Post::factory()->count(10)->create();
$title = $posts->first()->title;
livewire(PostResource\Pages\ListPosts::class)
->searchTableColumns(['title' => $title])
->assertCanSeeTableRecords($posts->where('title', $title))
->assertCanNotSeeTableRecords($posts->where('title', '!=', $title));
});要对表格记录进行排序,你可以调用 sortTable(),并传入要排序的列名。你可以在 sortTable() 的第二个参数中使用 'desc' 来反转排序方向。
一旦表格排序完成,您可以确保表格记录按顺序呈现,方法是使用 assertCanSeeTableRecords() 并带上 inOrder 参数:
use function Pest\Livewire\livewire;
it('can sort posts by title', function () {
Post::factory()->count(10)->create();
$sortedPostsAsc = Post::query()->orderBy('title')->get();
$sortedPostsDesc = Post::query()->orderBy('title', 'desc')->get();
livewire(PostResource\Pages\ListPosts::class)
->sortTable('title')
->assertCanSeeTableRecords($sortedPostsAsc, inOrder: true)
->sortTable('title', 'desc')
->assertCanSeeTableRecords($sortedPostsDesc, inOrder: true);
});Filament 表使用 SQL 的 order 语句在记录输出前对其进行排序。不同的数据库驱动程序可以使用不同的排序策略,并且它们可能与 PHP 自身的排序策略不同,因此您应该确保测试记录是使用数据库查询上的 orderBy() 而不是模型集合上的 sortBy() 进行排序的。
要断言某个列对于一条记录具有状态或不具有状态,您可以使用 assertTableColumnStateSet() 和 assertTableColumnStateNotSet():
use function Pest\Livewire\livewire;
it('can get post author names', function () {
$posts = Post::factory()->count(10)->create();
$post = $posts->first();
livewire(PostResource\Pages\ListPosts::class)
->assertTableColumnStateSet('author.name', $post->author->name, record: $post)
->assertTableColumnStateNotSet('author.name', 'Anonymous', record: $post);
});要断言某个列对于一条记录具有格式化状态或不具有格式化状态,你可以使用 assertTableColumnFormattedStateSet() 和 assertTableColumnFormattedStateNotSet():
use function Pest\Livewire\livewire;
it('can get post author names', function () {
$post = Post::factory(['name' => 'John Smith'])->create();
livewire(PostResource\Pages\ListPosts::class)
->assertTableColumnFormattedStateSet('author.name', 'Smith, John', record: $post)
->assertTableColumnFormattedStateNotSet('author.name', $post->author->name, record: $post);
});为确保列存在,可以使用 assertTableColumnExists() 方法:
use function Pest\Livewire\livewire;
it('has an author column', function () {
livewire(PostResource\Pages\ListPosts::class)
->assertTableColumnExists('author');
});您可以传入一个函数作为附加参数,以断言某个列通过了给定的“真值测试”。这对于断言某个列具有特定配置很有用。您还可以传入一个记录作为第三个参数,这在您的检查依赖于正在渲染的表格行时很有用:
use function Pest\Livewire\livewire;
use Filament\Tables\Columns\TextColumn;
it('has an author column', function () {
$post = Post::factory()->create();
livewire(PostResource\Pages\ListPosts::class)
->assertTableColumnExists('author', function (TextColumn $column): bool {
return $column->getDescriptionBelow() === $post->subtitle;
}, $post);
});为确保特定用户无法看到某个列,您可以使用 assertTableColumnVisible() 和 assertTableColumnHidden() 方法:
use function Pest\Livewire\livewire;
it('shows the correct columns', function () {
livewire(PostResource\Pages\ListPosts::class)
->assertTableColumnVisible('created_at')
->assertTableColumnHidden('author');
});为确保列上方或下方具有正确的描述,您可以使用 assertTableColumnHasDescription() 和 assertTableColumnDoesNotHaveDescription() 方法:
use function Pest\Livewire\livewire;
it('has the correct descriptions above and below author', function () {
$post = Post::factory()->create();
livewire(PostsTable::class)
->assertTableColumnHasDescription('author', 'Author! ↓↓↓', $post, 'above')
->assertTableColumnHasDescription('author', 'Author! ↑↑↑', $post)
->assertTableColumnDoesNotHaveDescription('author', 'Author! ↑↑↑', $post, 'above')
->assertTableColumnDoesNotHaveDescription('author', 'Author! ↓↓↓', $post);
});为确保列具有正确的额外属性,您可以使用 assertTableColumnHasExtraAttributes() 和 assertTableColumnDoesNotHaveExtraAttributes() 方法:
use function Pest\Livewire\livewire;
it('displays author in red', function () {
$post = Post::factory()->create();
livewire(PostsTable::class)
->assertTableColumnHasExtraAttributes('author', ['class' => 'text-danger-500'], $post)
->assertTableColumnDoesNotHaveExtraAttributes('author', ['class' => 'text-primary-500'], $post);
});SelectColumn 中的选项如果您有一个选择列,您可以使用 assertTableSelectColumnHasOptions() 和 assertTableSelectColumnDoesNotHaveOptions() 确保它具有正确的选项:
use function Pest\Livewire\livewire;
it('has the correct statuses', function () {
$post = Post::factory()->create();
livewire(PostsTable::class)
->assertTableSelectColumnHasOptions('status', ['unpublished' => 'Unpublished', 'published' => 'Published'], $post)
->assertTableSelectColumnDoesNotHaveOptions('status', ['archived' => 'Archived'], $post);
});要筛选表格记录,您可以使用 filterTable() 方法,以及 assertCanSeeTableRecords() 和 assertCanNotSeeTableRecords():
use function Pest\Livewire\livewire;
it('can filter posts by `is_published`', function () {
$posts = Post::factory()->count(10)->create();
livewire(PostResource\Pages\ListPosts::class)
->assertCanSeeTableRecords($posts)
->filterTable('is_published')
->assertCanSeeTableRecords($posts->where('is_published', true))
->assertCanNotSeeTableRecords($posts->where('is_published', false));
});对于一个简单的过滤器,这只会启用该过滤器。
如果您想设置 SelectFilter 或 TernaryFilter 的值,请将该值作为第二个参数传递:
use function Pest\Livewire\livewire;
it('can filter posts by `author_id`', function () {
$posts = Post::factory()->count(10)->create();
$authorId = $posts->first()->author_id;
livewire(PostResource\Pages\ListPosts::class)
->assertCanSeeTableRecords($posts)
->filterTable('author_id', $authorId)
->assertCanSeeTableRecords($posts->where('author_id', $authorId))
->assertCanNotSeeTableRecords($posts->where('author_id', '!=', $authorId));
});要将所有筛选器重置为其原始状态,调用 resetTableFilters():
use function Pest\Livewire\livewire;
it('can reset table filters', function () {
$posts = Post::factory()->count(10)->create();
livewire(PostResource\Pages\ListPosts::class)
->resetTableFilters();
});若要移除单个筛选器,您可以使用 removeTableFilter():
use function Pest\Livewire\livewire;
it('filters list by published', function () {
$posts = Post::factory()->count(10)->create();
$unpublishedPosts = $posts->where('is_published', false)->get();
livewire(PostsTable::class)
->filterTable('is_published')
->assertCanNotSeeTableRecords($unpublishedPosts)
->removeTableFilter('is_published')
->assertCanSeeTableRecords($posts);
});要移除所有过滤器,您可以使用removeTableFilters():
use function Pest\Livewire\livewire;
it('can remove all table filters', function () {
$posts = Post::factory()->count(10)->forAuthor()->create();
$unpublishedPosts = $posts
->where('is_published', false)
->where('author_id', $posts->first()->author->getKey());
livewire(PostsTable::class)
->filterTable('is_published')
->filterTable('author', $author)
->assertCanNotSeeTableRecords($unpublishedPosts)
->removeTableFilters()
->assertCanSeeTableRecords($posts);
});为确保特定用户无法看到某个过滤器,您可以使用 assertTableFilterVisible() 和 assertTableFilterHidden() 方法:
use function Pest\Livewire\livewire;
it('shows the correct filters', function () {
livewire(PostsTable::class)
->assertTableFilterVisible('created_at')
->assertTableFilterHidden('author');
});为了确保过滤器存在,您可以使用 assertTableFilterExists() 方法:
use function Pest\Livewire\livewire;
it('has an author filter', function () {
livewire(PostResource\Pages\ListPosts::class)
->assertTableFilterExists('author');
});您可以传递一个函数作为额外参数,以断言过滤器通过了给定的“真值测试”。这对于断言过滤器具有特定配置很有用:
use function Pest\Livewire\livewire;
use Filament\Tables\Filters\SelectFilter;
it('has an author filter', function () {
livewire(PostResource\Pages\ListPosts::class)
->assertTableFilterExists('author', function (SelectFilter $column): bool {
return $column->getLabel() === 'Select author';
});
});为了测试汇总计算是否正常工作,您可以使用 assertTableColumnSummarySet() 方法:
use function Pest\Livewire\livewire;
it('can average values in a column', function () {
$posts = Post::factory()->count(10)->create();
livewire(PostResource\Pages\ListPosts::class)
->assertCanSeeTableRecords($posts)
->assertTableColumnSummarySet('rating', 'average', $posts->avg('rating'));
});第一个参数是列名,第二个是聚合器 ID,第三个是期望值。
注意,预期值和实际值经过了标准化处理,使得 123.12 被视为与 "123.12" 相同,并且 ['Fred', 'Jim'] 与 ['Jim', 'Fred'] 相同。
您可以将摘要器 ID 传递给 make() 方法来设置它:
use Filament\Tables\Columns\Summarizers\Average;
use Filament\Tables\Columns\TextColumn;
TextColumn::make('rating')
->summarize(Average::make('average'))ID 在该列的汇总器之间应是唯一的。
要计算仅针对单个分页页面的平均值,请使用 isCurrentPaginationPageOnly 参数:
use function Pest\Livewire\livewire;
it('can average values in a column', function () {
$posts = Post::factory()->count(20)->create();
livewire(PostResource\Pages\ListPosts::class)
->assertCanSeeTableRecords($posts->take(10))
->assertTableColumnSummarySet('rating', 'average', $posts->take(10)->avg('rating'), isCurrentPaginationPageOnly: true);
});要测试范围,将最小值和最大值传入一个元组风格的 [$minimum, $maximum] 数组:
use function Pest\Livewire\livewire;
it('can average values in a column', function () {
$posts = Post::factory()->count(10)->create();
livewire(PostResource\Pages\ListPosts::class)
->assertCanSeeTableRecords($posts)
->assertTableColumnSummarySet('rating', 'range', [$posts->min('rating'), $posts->max('rating')]);
});默认情况下,只有表中默认开启的列才会被渲染和测试。您可以使用 toggleAllTableColumns() 开启表中的所有列:
use function Pest\Livewire\livewire;
it('can toggle all columns', function () {
livewire(PostResource\Pages\ListPosts::class)
->toggleAllTableColumns();
});你也可以使用 toggleAllTableColumns(false) 关闭所有列:
use function Pest\Livewire\livewire;
it('can toggle all columns off', function () {
livewire(PostResource\Pages\ListPosts::class)
->toggleAllTableColumns(false);
});