Я не могу понять, не удается ли Laravel загрузить черту моей модели или просто не видит пользователя, выполняющего аутентификацию внутри черты.
Весь этот код прекрасно работает, когда я тестирую свое приложение вручную, но когда я запускаю модульные тесты, я получаю кучу ошибок.
Вот черта, которую я добавил к App\User
и нескольким другим моделям:
trait HasCompany
{
public static function bootHasCompany()
{
if (auth()->check()) {
static::creating(function ($model) {
$model->company_id = auth()->user()->company_id;
});
static::addGlobalScope('company_id', function (Builder $builder) {
$builder->where('company_id', auth()->user()->company_id);
});
}
}
public function company()
{
return $this->belongsTo('App\Company');
}
}
Целью этой черты является автоматическое добавление зарегистрированных пользователей company_id
к любым моделям, которые они создают, и ограничение их доступа только к моделям, которые они создали. Я должен отметить, что все App\User
имеют company_id
в базе данных.
Итак, как я уже сказал, когда я пытаюсь создать модель при входе в свое приложение, все отлично работает. Черта работает отлично. Тем не менее, модульные тесты, кажется, не заботятся об этой особенности. Вот пример теста, который не работает:
class RoleTest extends TestCase
{
use WithFaker;
public $user;
public function setup()
{
parent::setUp();
$this->user = App\User::create([
'company_id' => $faker->randomNumber(),
'name' => $this->faker->firstName,
'email' => $this->faker->email,
'password' => $this->faker->password,
]);
}
public function tearDown()
{
parent::tearDown();
$this->user->delete();
}
public function testAdd()
{
$response = $this->actingAs($this->user)->json('POST', 'roles/add', [
'_token' => csrf_token(),
'name' => $this->faker->word,
]);
$response->assertStatus(200)->assertJson(['flash' => true]);
}
}
Я получаю ответ 500 вместо ответа 200, потому что модель должна автоматически получать company_id
от $this->user
, но это не так. Это происходит только для юнит-тестов.
Вот код модели:
class Role extends Model
{
use HasCompany;
protected $fillable = ['company_id', 'name'];
}
Почему юнит-тесты не загружают черту должным образом? Похоже, что actingAs
не работает для авторизации в чертах или не может полностью загрузить свои черты.