我不知道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'];
}
不能在特征中进行授权,或者无法完全启动其特征。
答案 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);
}
});