اذهب إلى المحتوى

السؤال

نشر

لدي مشروع يستخدم مكتبة Socialite لتسجيل دخول المستخدمين، وأحاول الآن استخدام Socialite Facade لاستدعاء ال driver الخاص بالمكتبة ولكن يظهر لدي خطأ بأنني أحاول الحصول على قيمة من عنصر null، هذا هو الكود:

public function testGithubLogin()
{
    Socialite::shouldReceive('driver')
        ->with('github')
        ->once();
    $this->call('GET', '/github/authorize')->isRedirection();
}

وأقوم باستدعاء الكود السابق بهذا الشكل:

public function authorizeProvider($provider)
{
    return Socialite::driver($provider)->redirect();
}

وأرغب في إجراء بعض الاختبارات على المكتبة ضمن مشروعي والتحقق من آلية تسجيل المستخدم فكيف يمكنني تنفيذ ذلك عن طريق استخدام Mockery أو غيرها في لارافل؟

Recommended Posts

  • 0
نشر

أولاً يجب إنشاء mock للمستخدم واستدعائه على Socialite:

$abstractUser = Mockery::mock('Laravel\Socialite\Two\User')

ثم يمكن إضافة القيم المتوقع الحصول عليها من التجربة:

$abstractUser
   ->shouldReceive('getId')
   ->andReturn(rand())
   ->shouldReceive('getName')
   ->andReturn(str_random(10))
   ->shouldReceive('getEmail')
   ->andReturn(str_random(10) . '@gmail.com')
   ->shouldReceive('getAvatar')
   ->andReturn('https://en.gravatar.com/userimage');
   ........

وبعدها، يجب استخدام shouldReceive لقيم المستخدم بالشكل التالي:

Socialite::shouldReceive('driver->user')->andReturn($abstractUser);

وأخيراً يمكننا تنفيذ هذا الإجراء كالتالي:

$this->visit('/auth/github/callback')
     ->seePageIs('/')

ومن الممكن أيضاً دمج آلية الاختبار ضمن كتلة واحدة بالشكل التالي:

$provider = Mockery::mock('Laravel\Socialite\Contracts\Provider');
$provider->shouldReceive('redirect')->andReturn('Redirected');
$providerName = class_basename($provider);

//استدعاء المودل 
$socialAccount = factory('test\User')->create(['provider' => $providerName]);

$abstractUser = Mockery::mock('Laravel\Socialite\Two\User');

// الحصول على المستخدم من API
$abstractUser->shouldReceive('getId') 
             ->andReturn($socialAccount->provider_user_id)
             ->shouldReceive('getEmail')
             ->andReturn(str_random(10).'@gmail.com')
             ->shouldReceive('getNickname')
             ->andReturn('Laztopaz')
             ->shouldReceive('getAvatar')
             ->andReturn('https://en.gravatar.com/userimage');

$provider = Mockery::mock('Laravel\Socialite\Contracts\Provider');
$provider->shouldReceive('user')->andReturn($abstractUser);

Socialite::shouldReceive('driver')->with('github')->andReturn($provider);

// بعد التحقق والتوثيق من المستخدم سيتم إعادة التوجيه
$this->visit('/auth/facebook/callback')

// زيارة الصفحة بعد تسجيل الدخول للمستخدم
->seePageIs('/');

ويجب أيضاً تضمين الصف use Laravel\Socialite\Facades\Socialite عند استخدامه في الملف المطلوب.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...