سلام دوستان روز بخیر
من برای پروژم پرمیشن ساختم و حالا تست براش نوشتم
/** @test **/
public function Manager_can_create_a_account_for_a_new_user ()
{
$this->withoutExceptionHandling();
$manager = $this->singIn();
$this->giveManagementRoleAndPermissionsTo($manager);
$this->postJson('/api/v1/admin/register', [
"name" => "john",
"province" => "tehran",
"city" => "tehran",
"phone" => "09123456789",
])->assertJson([
'status' => 201
]);
$this->assertDatabaseHas('users', [
'phone' => "09123456789",
]);
توی تست همونطور که معلومه یه یوزر ساختم و بهش نقش و مجوز ها رو دادم و حالا این یوزر به عنوان مدیر باید بتونه کاربر ایجاد کنه و در ادامه تست همینکارو کردم که ببینم میتونه یوزر ایجاد کنه وقتی به اون روت اطلاعات رو ارسال میکنیم به کنترلر زیر میره
public function store()
{
$this->authorize('create-user');
request()->validate([
'name' => 'required',
'phone' => 'required',
'province' => 'required',
'city' => 'required',
]);
$password = Str::random(7);
$user = User::create([
'name' => request()->name,
'phone' => request()->phone,
'password' => Hash::make($password)
]);
return response()->json([
'user' => $user,
'message' => 'حساب با موفقیت ایجاد شد.',
'status' => 201,
], 201);
}
حالا اینجا که به متد authorize میرسه میره Gateی که در یک service provider جدید براش نوشتم رو چک میکنه
public function boot()
{
try {
Permission::get()->map(function ($permission) {
Gate::define($permission->slug, function ($user) use ($permission) {
return $user->hasPermissionTo($permission);
});
});
} catch (\Exception $e) {
report($e);
return false;
}
}
وقتی تست رو اجرا میکنم به اینجا که میرسه ارور زیر رو میده
Illuminate\Auth\Access\AuthorizationException : This action is unauthorized.
در حالی که وقتی در postman انجام میدم به درستی کار میکنه و فقط در تست مشکل داره
سرچ هم کردم چیز خاصی پیدا نکردم
ممنون میشم اگر راهنمایی کنید
در حال حاظر داره یک AuthorizationException پرتاب میشه... با وجودی که اکسپشن هندلینگ رو هم غیر فعال کردی..
آیا داخل متد giveManagementRoleAndPermissionsTo به درستی پرمیشن میدید به کاربر؟
بله علی آقا تستش کردم همه چی درسته حتی با postman هم درست کار میکنه نمیدونم چرا تو تست درست کار نمیکنه
حتی وقتی تست رو ران میکنم تو service provider یوزر رو dd میکنم null میده در حالی که تو کنترلر یوزر رو نمایش میده
یه متد setUp به کلاس تست اضافه کن:
public function setUp()
{
parent::setUp();
$this->app->make(Permission::class)->registerPermissions();
}
ببین مشکل حل میشه؟
اضافه کردم این اررور اورد و متد قرمز رنگ میشد
Return type declaration must be compatible with TestCase->setUp() : void
بعد که :void رو به آخر متد اضافه کردم و تست رو ران کردم این اررور اومد
BadMethodCallException : Call to undefined method App\Permission::registerPermissions()
کلاس Permission رو باید درست import کنی..
اینجا چون NameSpace ی بهش نداید فرض میکنه که داخل App هست..
use Spatie\Permission\Models\Permission;
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟