parsa
5 سال پیش توسط parsa مطرح شد
7 پاسخ

مشکل در گرین کردن تست در استفاده از متد authorize

سلام دوستان روز بخیر

من برای پروژم پرمیشن ساختم و حالا تست براش نوشتم

/** @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 انجام میدم به درستی کار میکنه و فقط در تست مشکل داره

سرچ هم کردم چیز خاصی پیدا نکردم

ممنون میشم اگر راهنمایی کنید

@hesammousavi
@ali.bayat
@juza66
@hossein.r.1442


ثبت پرسش جدید
parsa
@parsahaghighi 5 سال پیش مطرح شد
0

کسی نمیتونه کمک کنه؟؟


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

در حال حاظر داره یک AuthorizationException پرتاب میشه... با وجودی که اکسپشن هندلینگ رو هم غیر فعال کردی..
آیا داخل متد giveManagementRoleAndPermissionsTo به درستی پرمیشن میدید به کاربر؟


parsa
@parsahaghighi 5 سال پیش مطرح شد
0

@ali.bayat

بله علی آقا تستش کردم همه چی درسته حتی با postman هم درست کار میکنه نمیدونم چرا تو تست درست کار نمیکنه

حتی وقتی تست رو ران میکنم تو service provider یوزر رو dd میکنم null میده در حالی که تو کنترلر یوزر رو نمایش میده


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

یه متد setUp به کلاس تست اضافه کن:

    public function setUp()
    {
        parent::setUp();

        $this->app->make(Permission::class)->registerPermissions();
    }

ببین مشکل حل میشه؟


parsa
@parsahaghighi 5 سال پیش مطرح شد
0

@ali.bayat

اضافه کردم این اررور اورد و متد قرمز رنگ میشد

Return type declaration must be compatible with TestCase->setUp() : void 

بعد که :void رو به آخر متد اضافه کردم و تست رو ران کردم این اررور اومد

BadMethodCallException : Call to undefined method App\Permission::registerPermissions()

علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

کلاس Permission رو باید درست import کنی..
اینجا چون NameSpace ی بهش نداید فرض میکنه که داخل App هست..

use Spatie\Permission\Models\Permission;

parsa
@parsahaghighi 5 سال پیش مطرح شد
0

نه نشد مشکل با اینم حل نشد


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام