Laravel在单元测试中不引导特征/认证用户

时间:2018-09-07 23:48:33

标签: php laravel unit-testing

我不知道Laravel是无法启动我的模型特征,还是根本看不到用户在特征中已通过身份验证。

当我手动测试我的应用程序时,所有这些代码都可以正常工作,但是当我运行单元测试时,我会遇到很多错误。

这是我添加到<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <div id="root"></div>和其他一些模型中的特征:

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

我得到500响应而不是200响应,因为模型应该自动从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]); } } 获得company_id,但不是。这仅在单元测试中发生。

这是型号代码:

$this->user

为什么单元测试不能正确启动特性?似乎class Role extends Model { use HasCompany; protected $fillable = ['company_id', 'name']; } 不能在特征中进行授权,或者无法完全启动其特征。

1 个答案:

答案 0 :(得分:0)

在单元测试中,使用设置功能创建用户时,将首先引导用户模型。那时,没有用户通过身份验证(如稍后的actingAs所示)。因此,auth()->check()仅在创建用户时发生一次。

我认为您应该在用户创建过程中检查是否已通过身份验证,而不是检查一次(在启动期间是否通过了身份验证)。

从bootHasCompany中删除if(auth()->check())并将其添加到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);
    }
});