我已经使用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);
}
答案 0 :(得分:1)
在文档的“事件伪造”部分中:
在调用Event :: fake()之后,将不执行任何事件侦听器。所以, 如果您的测试使用依赖于事件的模型工厂,例如 在模型的创建事件中创建UUID时,您应该调用 使用工厂后出现Event :: fake()。
答案 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);
}