在Laravel测试中如何在一次测试中注销?

在Laravel测试中如何在一次测试中注销?,laravel,unit-testing,Laravel,Unit Testing,Laravel v5.7.1 我有多个具有相同断言的测试,希望将它们移动到一个函数中,并从测试中调用它。下面是函数的示例: private function admin_only($url, $method = 'GET', $data = []) { // \Auth::logout(); $response = $this->json($method, $url, $data); $response->assertStatus(401); $res

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 Illumb\Auth\RequestGuard::logout不存在。


像“第二次呼叫的单独测试”、“无切换恢复”、“非管理员用户和来宾的相同响应代码”这样的解决方案应该可以工作,但对我来说似乎是错误的。

可能您有不同的防护>>所以这可能可以工作

Auth::guard('admin')->logout();

您可以将“admin”更改为任何保护名称,幸运的是
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中使用它会很方便

不幸的是,事实并非如此。我有两个默认的用于auth的laravel防护,这是
api
一个
['middleware'=>['auth:api']
\auth::guard('api')->logout();
抛出了相同的错误您是否尝试将
auth
使用lightage\Support\Facades\auth;
一起使用
auth::logout()
没有\?刚刚尝试过,仍然是相同的错误。应该是可以接受的答案。您也可以使用
Auth
facadelogout@andrewtweber使用Auth facade for me会导致sam错误。