测试
概述
所有本指南内的示例都使用 Pest 编写。不过,你可以将其适配到 PHPUnit。
因为表格构造器是基于 Livewire 组件的,因此你也可以使用 Livewire 测试辅助函数。不过,我们自定义了一些测试辅助函数,让你可以用于表格测试:
渲染
要确保表格组件渲染,请使用 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()只会检查第一页中的记录。要切换页面,请调用set('page', 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 默认不展示在当前表格。
排序
想要对表格进行排序,你可以调用 sortTable(),传入要排序的列名。你可以在 sortTable() 的第二个参数中使用 'desc',来反转排序方向。
当表格排序完,你可以使用 assertCanSeeTableRecords() 并带上 inOrder 参数来断言表格记录按顺序渲 染:
use function Pest\Livewire\livewire;
it('can sort posts by title', function () {
$posts = Post::factory()->count(10)->create();
livewire(PostResource\Pages\ListPosts::class)
->sortTable('title')
->assertCanSeeTableRecords($posts->sortBy('title'), inOrder: true)
->sortTable('title', 'desc')
->assertCanSeeTableRecords($posts->sortByDesc('title'), inOrder: true);
});
搜索
要搜索表格,请在搜索查询里调用 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));
});
状态
要断言记录中特定的列有或者没有状态,你可以使用 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);
});
Select Column
使用 assertSelectColumnHasOptions() 和 assertSelectColumnDoesNotHaveOptions() 可以断言 SelectColomn 中的选项是否正确:
use function Pest\Livewire\livewire;
it('has the correct statuses', function () {
$post = Post::factory()->create();
livewire(PostsTable::class)
->assertSelectColumnHasOptions('status', ['unpublished' => 'Unpublished', 'published' => 'Published'], $post)
->assertSelectColumnDoesNotHaveOptions('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);
});