Laravel测试:模型工厂确实触发事件

时间:2019-02-21 22:12:14

标签: laravel phpunit

我已经使用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 :(得分:1)

在文档的“事件伪造”部分中:

  

在调用Event :: fake()之后,将不执行任何事件侦听器。所以,   如果您的测试使用依赖于事件的模型工厂,例如   在模型的创建事件中创建UUID时,您应该调用   使用工厂后出现Event :: fake()。

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

答案 1 :(得分:1)

使用Laravel提供的身份验证支架时, controller 会调度Registered事件(特别是register()特性中的Illuminate\Foundation\Auth\RegistersUsers方法。由于您不是通过控制器发出请求,它不会调度事件。

答案 2 :(得分:1)

当我们通过laravel的默认注册进行注册时,事件Illuminate\Auth\Events\Registered由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);
}