Laravel не загружает черту / аутентификацию пользователя в юнит-тестах - PullRequest
0 голосов
/ 08 сентября 2018

Я не могу понять, не удается ли 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 не работает для авторизации в чертах или не может полностью загрузить свои черты.

1 Ответ

0 голосов
/ 08 сентября 2018

В ваших модульных тестах пользовательская модель сначала загружается, когда пользователь создается функцией настройки.В это время ни один пользователь не аутентифицируется (как действует, как следует позже).Таким образом, auth()->check() происходит только один раз при создании пользователя.

Я думаю, вместо того, чтобы проверять, прошла ли аутентификация один раз (во время загрузки), вы должны проверить, прошла ли аутентификация при создании пользователя.

Удалить if(auth()->check()) из bootHasCompany и добавить его в замыкания событий Eloquent, например:итак:

static::creating(function ($model) {
    if(auth()->check())
    {
        $model->company_id = auth()->user()->company_id;
    }
});
static::addGlobalScope('company_id', function (Builder $builder) {
    if(auth()->check())
    {
        $builder->where('company_id', auth()->user()->company_id);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...