Тестирование Laravel: фабрика моделей не запускает зарегистрированное событие - PullRequest
0 голосов
/ 22 февраля 2019

Я уже давно использую Laravel 5.7, однако я совершенно новичок в TDD.

Если создается пользовательская модель, запускается событие register.Но почему он не запускается, когда я создаю пользовательскую модель с фабрикой?

Моя фабрика:

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'first_name' => $faker->name,
        'sur_name' => $faker->name,
        'phone' => $faker->phoneNumber,
        'birthday' => Carbon::now()->subYears(25)->toDateTimeString(),
        'gender' => 'm',
        'email' => $faker->unique()->safeEmail,
        'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
        'remember_token' => str_random(10),
    ];
});

и мой тест, который не проходит:

public function test()
{

    $this->withoutExceptionHandling();

    Event::fake();
    $user = factory(User::class)->create();

    Event::assertDispatched(Registered::class);

}

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Событие Registered отправляется контроллером при использовании лесов авторизации, предоставленных Laravel (в частности, метод register() в признаке Illuminate\Foundation\Auth\RegistersUsers. Поскольку вы не делаете запрос черезконтроллер не отправляет событие.

0 голосов
/ 22 февраля 2019

Поскольку событие Illuminate\Auth\Events\Registered запускается Laravel, когда мы регистрируемся через стандартную регистрацию laravel.

Когда вы делаете: $user = factory(User::class)->create();

Это просто заполняет новую запись в базе данных, пропуская процесс регистрации.Для проверки регистрации по умолчанию вы можете сделать что-то вроде ниже:

<?php 

public function test_if_user_can_register()
{
    $response = $this->post('/register', [
      'name' => 'John Doe',
      'email' => 'johndoe@test.com',
      'password' => 'secret',
      'password_confirmation' => 'secret'
    ]);

    $response->assertRedirect('/');
    Event::assertDispatched(Registered::class);

    unset($user['password']);
    unset($user['password_confirmation']);

    $this->assertDatabaseHas('users', $user);
}
0 голосов
/ 22 февраля 2019

Из раздела «Подделка событий» документов:

После вызова Event :: fake () прослушиватели событий не будут выполняться.Поэтому, если в ваших тестах используются фабрики моделей, основанные на событиях, таких как создание UUID во время события создания модели, вы должны вызывать Event :: fake () после использования ваших фабриок.

https://laravel.com/docs/5.7/mocking

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...