单元测试

未匹配的标注
本文档最新版为 2.x,旧版本可能放弃维护,推荐阅读最新版!

单元测试

Livewire提供了一组功能强大的工具来测试您的组件。

这是一个 Livewire 组件以及相应的测试,以演示基础知识。

use Livewire\Component;

class CreatePost extends Component
{
    public $title;

    public function mount($initialTitle = '')
    {
        $this->title = $initialTitle;
    }

    public function create()
    {
        auth()->user()->posts()->create($this->validate([
            'title' => 'required',
        ]);

        return redirect()->to('/posts');
    }

    public function render()
    {
        return view('livewire.create-post');
    }
}
<form wire:submit.prevent="create">
    <input wire:model="title" type="text">

    <button>Create Post</button>
</form>
class CreatePostTest extends TestCase
{
    /** @test  */
    function can_create_post()
    {
        $this->actingAs(factory(User::class)->create())

        Livewire::test(CreatePost::class)
            ->set('title', 'foo')
            ->call('create');

        $this->assertTrue(Post::whereTitle('foo')->exists());
    }

    /** @test  */
    function can_set_initial_title()
    {
        $this->actingAs(factory(User::class)->create())

        Livewire::test(CreatePost::class, ['initialTitle' => 'foo'])
            ->assertSet('title', 'foo');
    }

    /** @test  */
    function title_is_required()
    {
        $this->actingAs(factory(User::class)->create())

        Livewire::test(CreatePost::class)
            ->set('title', '')
            ->call('create')
            ->assertHasErrors(['title' => 'required']);
    }

    /** @test  */
    function is_redirected_to_posts_page_after_creation()
    {
        $this->actingAs(factory(User::class)->create())

        Livewire::test(CreatePost::class)
            ->set('title', 'foo')
            ->call('create')
            ->assertRedirect('/posts');
    }
}

测试组件状态

Livewire 注册了一个方便的 PHPUnit 方法来测试组件在页面上是否存在。

class CreatePostTest extends TestCase
{
    /** @test  */
    function post_creation_page_contains_livewire_component()
    {
        $this->get('/posts/create')->assertSeeLivewire('create-post');
    }
}

所有可以使用的测试方法

Livewire::actingAs($user);
// 将提供的用户设置为会话的测试登录用户

Livewire::test('foo', ['bar' => $bar]);
// 使用“ bar”作为参数测试“ foo”组件。

->set('foo', 'bar');
// 将“ foo”属性(public $ foo)设置为值:“ bar”

->call('foo');
// 调用 "foo" 方法

->call('foo', 'bar', 'baz');
// 调用 "foo" 方法, 传递 "bar" 和 "baz" 参数

->emit('foo');
// 触发“ foo”事件

->emit('foo', 'bar', 'baz');
// 触发“ foo”事件, 传递 "bar" 和 "baz" 参数

->assertSet('foo', 'bar');
// 断言“ foo” 属性设置为值“ bar”

->assertNotSet('foo', 'bar');
// 断言“ foo”属性未设置为值“ bar”

->assertSee('foo');
// 断言字符串“ foo” 存在于组件的当前呈现内容中

->assertDontSee('foo');
// 断言字符串“ foo”在组件的当前呈现内容中不存在

->assertSeeHtml('<h1>foo</h1>');
// 断言字符串“ <h1> foo </ h1>”存在于组件的当前呈现的HTML中

->assertDontSeeHtml('<h1>foo</h1>');
// 断言字符串“ <h1> foo </ h1>”在当前呈现的组件HTML中不存在

->assertSeeHtml('<div></div>');
// 断言字符串“ <div> </ div>”存在于组件的当前呈现的HTML中

->assertDontSeeHtml('<div></div>');
// 断言字符串“ <div> </ div>”在HTML中不存在

->assertEmitted('foo');
// 断言发出了“ foo”事件

->assertEmitted('foo', 'bar', 'baz');
// 断言“ foo”事件是通过“ bar”和“ baz”参数发出的

->assertNotEmitted('foo');
// 断言没有发出“ foo”事件

->assertHasErrors('foo');
// 断言“ foo”属性具有验证错误

->assertHasErrors(['foo', 'bar']);
// 断言“ foo”和“ bar”属性具有验证错误

->assertHasErrors(['foo' => 'required']);
// 断言“ foo”属性具有“必需”验证规则错误

->assertHasErrors(['foo' => ['required', 'min']]);
// 断言“ foo”属性具有“ required”和“ min”验证规则错误

->assertHasNoErrors('foo');
// 断言“ foo”属性没有验证错误

->assertHasNoErrors(['foo', 'bar']);
// 断言“ foo”和“ bar”属性没有验证错误

->assertNotFound();
// 断言组件内的存在导致状态码为404的错误

->assertRedirect('/some-path');
// 断言从组件触发了重定向

->assertUnauthorized();
// 断言组件内存在导致状态码为 401 的错误

->assertForbidden();
// 断言组件内存在导致状态码为 403 的错误

->assertStatus(500);
// 断言组件内存在导致状态码为 500 的错误

->assertDispatchedBrowserEvent('event', $data);
// 断言使用(-> dispatchBrowserEvent(...))从组件调度了浏览器事件

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~