кодесурса
«Laravel

Laravel (5,7) Насмешливый

script1adsense2code
script1adsense3code

Вступление

Когда вы тестируете приложения Laravel, вы можете захотеть «смоделировать» определенные аспекты вашего приложения, чтобы они не выполнялись во время данного теста. Например, когда вы тестируете контроллер, отправляющий событие, вы можете смоделировать прослушиватели событий, чтобы они фактически не выполнялись во время теста. Это позволит вам проверять только HTTP-ответ контроллера, не беспокоясь о выполнении прослушивателей событий, поскольку прослушиватели событий также можно тестировать в их собственном тестовом примере.

Laravel предоставляет вам помощников для насмешливых событий, рабочих мест и фасадов из коробки. Эти помощники в первую очередь предоставляют удобный уровень над Mockery, так что вам не нужно вручную делать сложные вызовы метода Mockery. Вы также можете использовать PHPUnit или Mockery для создания своих собственных шуток или шпионов.

Автобус подделка

В качестве альтернативы, вместо использования насмешек, вы можете использовать поддельный метод Bus фасад, чтобы предотвратить отправку заданий. Когда вы используете подделки, утверждения будут сделаны после выполнения тестируемого кода:

<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Jobs\ShipOrder;
use Illuminate\Support\Facades\Bus;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
    public function testOrderShipping()
    {
        Bus::fake();
        // Perform order shipping...
        Bus::assertDispatched(ShipOrder::class, function ($job) use ($order) {
            return $job->order->id === $order->id;
        });
        // Asserts a job was not dispatched...
        Bus::assertNotDispatched(AnotherJob::class);
    }
}

Подделка событий

Вместо того, чтобы использовать насмешку, вы можете использовать поддельный метод Фасада события, чтобы предотвратить выполнение всех прослушивателей событий. Затем вы можете утверждать, что события были отправлены, и даже проверить полученные данные. Когда вы используете подделки, утверждения будут сделаны после выполнения тестируемого кода:

<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Events\OrderShipped;
use App\Events\OrderFailedToShip;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
    /**
     * Test order shipping.
     */
    public function testOrderShipping()
    {
        Event::fake();
        // Perform order shipping...
        Event::assertDispatched(OrderShipped::class, function ($e) use ($order) {
            return $e->order->id === $order->id;
        });
        // Asserts an event was dispatched twice...
        Event::assertDispatched(OrderShipped::class, 2);
        // Asserts an event was not dispatched...
        Event::assertNotDispatched(OrderFailedToShip::class);
    }
}

Подделка Подмножества Событий

В случае, если вы хотите только подделать прослушиватели событий для определенного набора событий, вы можете передать их методу fake или fakeFor:

/**
 * Test order process.
 */
public function testOrderProcess()
{
    Event::fake([
        OrderCreated::class,
    ]);
    $order = factory(Order::class)->create();
    Event::assertDispatched(OrderCreated::class);
    // Other events are dispatched as normal...
    $order->update([...]);
}

Scoped Event Подделки

В случаях, когда вы хотите подделать прослушиватели событий только для части вашего теста, вы можете использовать метод fakeFor:

<?php
namespace Tests\Feature;
use App\Order;
use Tests\TestCase;
use App\Events\OrderCreated;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
    /**
     * Test order process.
     */
    public function testOrderProcess()
    {
        $order = Event::fakeFor(function () {
            $order = factory(Order::class)->create();
            Event::assertDispatched(OrderCreated::class);
            return $order;
        });
        // Events are dispatched as normal and observers will run ...
        $order->update([...]);
    }
}

Подделка почты

Вы можете использовать поддельный метод Почтового фасада, чтобы предотвратить отправку почты. Затем вы можете утверждать, что почтовые сообщения были отправлены пользователям и даже проверять полученные данные. Когда вы используете подделки, утверждения будут сделаны после выполнения тестируемого кода:

<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Mail\OrderShipped;
use Illuminate\Support\Facades\Mail;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
    public function testOrderShipping()
    {
        Mail::fake();
        // Asserts that no mailables were sent...
        Mail::assertNothingSent();
        // Perform order shipping...
        Mail::assertSent(OrderShipped::class, function ($mail) use ($order) {
            return $mail->order->id === $order->id;
        });
        // Asserts a message was sent to the given users...
        Mail::assertSent(OrderShipped::class, function ($mail) use ($user) {
            return $mail->hasTo($user->email) &&
                   $mail->hasCc('...') &&
                   $mail->hasBcc('...');
        });
        // Asserts a mailable was sent twice...
        Mail::assertSent(OrderShipped::class, 2);
        // Assert a mailable was not sent...
        Mail::assertNotSent(AnotherMailable::class);
    }
}

В тех случаях, когда вы ставите в очередь почтовые сообщения для доставки в фоновом режиме, вам нужно будет использовать метод assertQueued вместо assertSent:

Mail::assertQueued(...);
Mail::assertNotQueued(...);

Подделка уведомлений

Вы можете использовать поддельный метод Notification фасадов, чтобы запретить отправку уведомлений. Затем вы можете утверждать, что уведомления были отправлены пользователям, и даже проверить данные, которые они получили. Когда вы используете подделки, утверждения будут сделаны после выполнения тестируемого кода:

<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Notifications\OrderShipped;
use Illuminate\Support\Facades\Notification;
use Illuminate\Notifications\AnonymousNotifiable;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
    public function testOrderShipping()
    {
        Notification::fake();
        // Asserts that no notifications were sent...
        Notification::assertNothingSent();
        // Perform order shipping...
        Notification::assertSentTo(
            $user,
            OrderShipped::class,
            function ($notification, $channels) use ($order) {
                return $notification->order->id === $order->id;
            }
        );
        // Asserts a notification was sent to the given users...
        Notification::assertSentTo(
            [$user], OrderShipped::class
        );
        // Asserts a notification was not sent...
        Notification::assertNotSentTo(
            [$user], AnotherNotification::class
        );
        // Asserts a notification was sent via Notification::route() method...
        Notification::assertSentTo(
            new AnonymousNotifiable, OrderShipped::class
        );            
    }
}

Подделка очереди

Вместо того, чтобы издеваться, вы можете использовать поддельный метод фасада очереди, чтобы предотвратить постановку задач в очередь. Затем вы можете утверждать, что задания были помещены в очередь и даже проверять полученные данные. Когда вы используете подделки, утверждения будут сделаны после выполнения тестируемого кода:

<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Jobs\ShipOrder;
use Illuminate\Support\Facades\Queue;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
    public function testOrderShipping()
    {
        Queue::fake();
        // Asserts that no jobs were pushed...
        Queue::assertNothingPushed();
        // Perform order shipping...
        Queue::assertPushed(ShipOrder::class, function ($job) use ($order) {
            return $job->order->id === $order->id;
        });
        // Asserts that a job was pushed to a given queue...
        Queue::assertPushedOn('queue-name', ShipOrder::class);
        // Asserts a job was pushed twice...
        Queue::assertPushed(ShipOrder::class, 2);
        // Asserts a job was not pushed...
        Queue::assertNotPushed(AnotherJob::class);
        // Asserts a job was pushed with a specific chain...
        Queue::assertPushedWithChain(ShipOrder::class, [
            AnotherJob::class,
            FinalJob::class
        ]);
    }
}

Подделка для хранения

Поддельный метод Storage фасад позволит вам легко сгенерировать поддельный диск, который в сочетании с утилитами генерации файлов класса UploadedFile значительно упростит тестирование загрузки файлов. Например:

<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
    public function testAvatarUpload()
    {
        Storage::fake('avatars');
        $response = $this->json('POST', '/avatar', [
            'avatar' => UploadedFile::fake()->image('avatar.jpg')
        ]);
        // Asserts the file was stored...
        Storage::disk('avatars')->assertExists('avatar.jpg');
        // Asserts a file does not exist...
        Storage::disk('avatars')->assertMissing('missing.jpg');
    }
}

Фасады

Фасады можно смоделировать, в отличие от традиционных вызовов статических методов. Это обеспечит большое преимущество по сравнению с традиционными статическими методами и предоставит вам такую же тестируемость, как и при использовании внедрения зависимостей. При тестировании вам часто может потребоваться смоделировать вызов фасада Laravel на одном из ваших контроллеров. Например, рассмотрим следующее действие контроллера ниже:

<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Cache;
class UserController extends Controller
{
    /**
     * Show a list of all users of the application.
     *
     * @return Response
     */
    public function index()
    {
        $value = Cache::get('key');
        //
    }
}

Вызов к фасаду Cache можно смоделировать с помощью метода shouldReceive, который возвращает экземпляр макета Mockery. Поскольку фасады фактически управляются и разрешаются сервисным контейнером Laravel, они обладают гораздо большей тестируемостью, чем типичный статический класс. Например, давайте посмеемся над нашим вызовом метода get фасета Cache:

<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Support\Facades\Cache;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class UserControllerTest extends TestCase
{
    public function testGetIndex()
    {
        Cache::shouldReceive('get')
                    ->once()
                    ->with('key')
                    ->andReturn('value');
        $response = $this->get('/users');
        // ...
    }
}

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code