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

时间:2018-11-07 11:47:30

标签: 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);
    $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.

诸如“对第二个电话进行单独测试”,“不切换切换”,“针对非管理员用户和来宾的相同响应代码”之类的解决方案应该可行,但对我来说似乎是错误的。

2 个答案:

答案 0 :(得分:0)

可能您有不同的警卫>>因此可能会起作用

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

您可以将“ admin”更改为警卫姓名

答案 1 :(得分:0)

幸运的是,RequestGuardMacroable,因此我们可以使用自己的方法对其进行扩展。尝试执行以下操作:

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中将其默认设置为方便。