Laravel v5.7.1
我有多个具有相同断言的测试,并且想要将它们移动到一个函数中并从测试中调用它。这是函数示例:
private function admin_only($url, $method = 'GET', $data = []) {
// \Auth::logout();
$response = $this->json($method, $url, $data);
$response->assertStatus(401);
$response = $this->actingAs($this->user(),'api')->json($method, $url, $data);
$response->assertStatus(403);
$response = $this->actingAs($this->admin(),'api')->json($method, $url, $data);
$response->assertStatus(200);
}
在这种情况下,我首先检查未经身份验证的用户,并且一切正常,但是有一些函数,API调用会切换某些状态,因此我想通过第二次调用函数将其还原:
$this->admin_only('/api/service/toggle-state', 'POST', $data);
$this->admin_only('/api/service/toggle-state', 'POST', $data);
同一测试中的第二次调用导致失败,因为第一个$this->json()
用作管理员并返回成功代码。
该\Auth::logout()
应该可以解决问题,但会引发错误BadMethodCallException: Method Illuminate\Auth\RequestGuard::logout does not exist.
诸如“对第二个电话进行单独测试”,“不切换切换”,“针对非管理员用户和来宾的相同响应代码”之类的解决方案应该可行,但对我来说似乎是错误的。
答案 0 :(得分:0)
可能您有不同的警卫>>因此可能会起作用
Auth::guard('admin')->logout();
您可以将“ admin”更改为警卫姓名
答案 1 :(得分:0)
幸运的是,RequestGuard
是Macroable
,因此我们可以使用自己的方法对其进行扩展。尝试执行以下操作:
use Illuminate\Auth\RequestGuard;
// ...
RequestGuard::macro('logout', function() {
$this->user = null;
});
$this->app['auth']->guard('api')->logout(); // or omit `->guard('api')` part
这与->actingAs
的操作相反。以下所有请求都将没有经过身份验证的用户。
这可以作为方法添加到基本测试类中,然后用作$this->actingAsGuest()
或类似名称。无论如何,在Laravel中将其默认设置为方便。