如何测试Laravel Socialite重定向与回调?Laravel5.6无visit/get方法无法重定向
首先肯定地说:完全可以测试Socialite的重定向和回调功能,Laravel 5.6只是调整了测试API,换个方式就能搞定。
一、测试重定向功能
Laravel 5.2里的visit()方法在5.6版本中确实被移除了,取而代之的是更贴合HTTP协议的get()、post()等方法。测试Socialite的重定向逻辑很简单:
访问你的Socialite授权路由,断言响应是重定向到第三方服务商的授权页面即可。举个GitHub登录的例子:
public function testSocialiteRedirect() { $response = $this->get('/auth/github'); // 断言重定向到GitHub的授权页面 $response->assertRedirectContains('github.com/login/oauth/authorize'); }
这里用assertRedirectContains而不是精确匹配,因为Socialite生成的URL会包含client_id、redirect_uri等参数,只要能匹配到服务商的授权域名和路径就足够验证逻辑正确了。
二、测试回调功能
回调涉及第三方返回的授权码,我们不需要真的去调用第三方接口,用Mockery模拟Socialite的驱动就能完成测试:
- 首先模拟一个Socialite用户对象,用来模拟第三方返回的用户信息
- 模拟Socialite的驱动,让它返回我们创建的模拟用户
- 带着伪造的授权码访问回调路由,断言后续的逻辑(比如登录、跳转页面)正常执行
示例代码:
use Laravel\Socialite\Facades\Socialite; use Mockery; public function testSocialiteCallback() { // 1. 创建模拟的用户数据 $mockUser = new \Laravel\Socialite\Two\User(); $mockUser->id = '12345'; $mockUser->name = 'Rafael Nery'; $mockUser->email = 'rafael@example.com'; $mockUser->avatar = 'https://example.com/avatar.jpg'; // 2. 模拟Socialite的Provider,让它返回我们的模拟用户 $mockProvider = Mockery::mock(\Laravel\Socialite\Contracts\Provider::class); $mockProvider->shouldReceive('user')->andReturn($mockUser); Socialite::shouldReceive('driver') ->with('github') // 替换成你用的服务商,比如google、facebook ->andReturn($mockProvider); // 3. 访问回调路由,带上伪造的code参数 $response = $this->get('/auth/github/callback?code=fake-authorization-code'); // 断言回调后跳转到你期望的页面,比如用户首页 $response->assertRedirect('/home'); // 额外断言:用户是否被正确创建/登录 $this->assertAuthenticatedAs(\App\User::whereEmail('rafael@example.com')->first()); }
几个注意点
- 确保你的测试类继承了Laravel的基础测试类
Illuminate\Foundation\Testing\TestCase - 测试完成后,Mockery会自动清理模拟对象(Laravel的测试环境已经集成了这个机制)
- 如果重定向测试失败,检查你的路由是否正确返回
Socialite::driver('github')->redirect()——这个方法返回的是标准的RedirectResponse,get()方法完全可以捕捉到这个响应
内容的提问来源于stack exchange,提问作者Rafael Nery
相关产品推荐
相关产品推荐

