Skip to content

[액션] 테스트

개요

이 가이드의 모든 예제는 Pest를 사용하여 작성되었습니다. Pest의 Livewire 플러그인을 테스트에 사용하려면 Pest 문서의 플러그인 설치 안내를 따라주세요: Pest용 Livewire 플러그인. 하지만 PHPUnit에 맞게 쉽게 변환할 수 있습니다.

모든 액션은 Livewire 컴포넌트에 마운트되므로, 우리는 어디서나 Livewire 테스트 헬퍼를 사용합니다. Livewire 컴포넌트를 테스트해본 적이 없다면, 이 가이드를 먼저 읽어보세요.

시작하기

액션을 호출하려면 callAction()에 이름이나 클래스를 전달하면 됩니다:

php
use function Pest\Livewire\livewire;

it('송장 전송이 가능하다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->callAction('send');

    expect($invoice->refresh())
        ->isSent()->toBeTrue();
});

액션에 데이터를 배열로 전달하려면 data 파라미터를 사용하세요:

php
use function Pest\Livewire\livewire;

it('송장 전송이 가능하다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->callAction('send', data: [
            'email' => $email = fake()->email(),
        ])
        ->assertHasNoActionErrors();

    expect($invoice->refresh())
        ->isSent()->toBeTrue()
        ->recipient_email->toBe($email);
});

액션의 데이터를 즉시 호출하지 않고 설정만 하고 싶다면 setActionData()를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('송장 전송이 가능하다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->mountAction('send')
        ->setActionData([
            'email' => $email = fake()->email(),
        ])
});

실행

액션이 중단되었는지 확인하려면 assertActionHalted()를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('송장에 이메일 주소가 없으면 전송을 중단한다', function () {
    $invoice = Invoice::factory(['email' => null])->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->callAction('send')
        ->assertActionHalted('send');
});

모달의 내용을 검증하려면, 액션을 호출하는 대신 먼저 마운트해야 합니다(호출하면 모달이 닫힙니다). 그런 다음 Livewire assertionassertSee() 등을 사용하여 모달에 원하는 내용이 포함되어 있는지 검증할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('전송 전에 대상 주소를 확인한다', function () {
    $invoice = Invoice::factory()->create();
    $recipientEmail = $invoice->company->primaryContact->email;

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->mountAction('send')
        ->assertSee($recipientEmail);
});

에러

assertHasNoActionErrors()는 액션 폼 제출 시 검증 에러가 발생하지 않았는지 확인하는 데 사용됩니다.

데이터에 검증 에러가 발생했는지 확인하려면, Livewire의 assertHasErrors()와 유사하게 assertHasActionErrors()를 사용하세요:

php
use function Pest\Livewire\livewire;

it('송장 수신자 이메일을 검증할 수 있다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->callAction('send', data: [
            'email' => Str::random(),
        ])
        ->assertHasActionErrors(['email' => ['email']]);
});

액션이 데이터로 미리 채워져 있는지 확인하려면 assertActionDataSet() 메서드를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('기본적으로 주요 연락처로 송장을 전송할 수 있다', function () {
    $invoice = Invoice::factory()->create();
    $recipientEmail = $invoice->company->primaryContact->email;

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->mountAction('send')
        ->assertActionDataSet([
            'email' => $recipientEmail,
        ])
        ->callMountedAction()
        ->assertHasNoActionErrors();

    expect($invoice->refresh())
        ->isSent()->toBeTrue()
        ->recipient_email->toBe($recipientEmail);
});

액션 상태

액션이 존재하는지 또는 존재하지 않는지 확인하려면 assertActionExists() 또는 assertActionDoesNotExist() 메서드를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('송장은 전송할 수 있지만, 전송 취소는 불가능하다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertActionExists('send')
        ->assertActionDoesNotExist('unsend');
});

액션이 사용자에게 숨겨져 있는지 또는 보이는지 확인하려면 assertActionHidden() 또는 assertActionVisible() 메서드를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('송장만 인쇄할 수 있다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertActionHidden('send')
        ->assertActionVisible('print');
});

액션이 사용자에게 활성화되어 있는지 또는 비활성화되어 있는지 확인하려면 assertActionEnabled() 또는 assertActionDisabled() 메서드를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('전송된 송장만 인쇄할 수 있다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertActionDisabled('send')
        ->assertActionEnabled('print');
});

액션 집합이 올바른 순서로 존재하는지 확인하려면 assertActionsExistInOrder()를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('액션이 순서대로 존재할 수 있다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertActionsExistInOrder(['send', 'export']);
});

액션이 사용자에게 숨겨져 있는지 확인하려면 assertActionHidden() 메서드를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('송장을 전송할 수 없다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertActionHidden('send');
});

버튼 모양

액션에 올바른 라벨이 있는지 확인하려면 assertActionHasLabel()assertActionDoesNotHaveLabel()을 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('send 액션에 올바른 라벨이 있다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertActionHasLabel('send', 'Email Invoice')
        ->assertActionDoesNotHaveLabel('send', 'Send');
});

액션 버튼이 올바른 아이콘을 표시하는지 확인하려면 assertActionHasIcon() 또는 assertActionDoesNotHaveIcon()을 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('활성화 시 send 버튼에 올바른 아이콘이 있다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertActionEnabled('send')
        ->assertActionHasIcon('send', 'envelope-open')
        ->assertActionDoesNotHaveIcon('send', 'envelope');
});

액션 버튼이 올바른 색상을 표시하는지 확인하려면 assertActionHasColor() 또는 assertActionDoesNotHaveColor()를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('액션이 적절한 색상을 표시한다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertActionHasColor('delete', 'danger')
        ->assertActionDoesNotHaveColor('print', 'danger');
});

URL

액션에 올바른 URL이 있는지 확인하려면 assertActionHasUrl(), assertActionDoesNotHaveUrl(), assertActionShouldOpenUrlInNewTab(), assertActionShouldNotOpenUrlInNewTab()을 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('올바른 Filament 사이트로 연결된다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertActionHasUrl('filament', 'https://filamentphp.com/')
        ->assertActionDoesNotHaveUrl('filament', 'https://github.com/filamentphp/filament')
        ->assertActionShouldOpenUrlInNewTab('filament')
        ->assertActionShouldNotOpenUrlInNewTab('github');
});

나를 위한 문서 한글화