如何解决Laravel中Auth门面Mocking不生效的问题
问题原因
你仅为Auth门面配置了user()方法的Mock预期,但Laravel底层的AuthManager在处理请求的认证流程时,还会自动调用userResolver()方法,你没有为该方法设置预期,因此Mockery抛出了对应异常。
解决方案
方案一(优先推荐):使用Laravel内置的测试认证方法
Laravel测试套件自带的actingAs()方法已经帮你处理了所有Auth相关的底层调用,完全不需要手动Mock Auth门面,写法更简洁也不会出现遗漏方法的问题:
$user = User::factory()->create(); $response = $this->actingAs($user) ->postJson(route('api.login'), [ 'username' => 'username', 'password' => 'test-password' ]) ->assertOk();
方案二:补全所有需要调用的方法的Mock预期
如果你确实因为特殊的用户数据源逻辑无法使用默认的actingAs()方法,需要手动Mock Auth门面,只需要补全userResolver()方法的预期即可:
$user = User::factory()->create(); Auth::shouldReceive('user')->andReturn($user); // 补全userResolver方法的预期,返回返回用户实例的闭包 Auth::shouldReceive('userResolver')->andReturn(fn() => $user); $response = $this->postJson(route('api.login'), [ 'username' => 'username', 'password' => 'test-password' ])->assertOk();
如果后续运行还有其他方法未设置预期的报错,对应补充对应方法的Mock规则即可。
内容的提问来源于stack exchange,提问作者Borassign
相关产品推荐
相关产品推荐

