راکت

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

7 پاسخ

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

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

/** @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

ثبت پرسش جدید

پاسخ‌ها

7
parsa
parsa
@parsahaghighi

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

شاید پاسخ شما همین‌جا باشد

parsa
parsa
@parsahaghighi

@ali.bayat

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

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

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

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

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

parsa
parsa
@parsahaghighi

@ali.bayat

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

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

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

BadMethodCallException : Call to undefined method App\Permission::registerPermissions()
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

use Spatie\Permission\Models\Permission;
parsa
parsa
@parsahaghighi

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

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

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