【问题标题】:Laravel test fails, but works on postmanLaravel 测试失败,但适用于邮递员
【发布时间】:2020-07-07 15:25:17
【问题描述】:

我对用户注销并删除其令牌进行了测试。


    use RefreshDatabase;

    public function setUp() :void {
        parent::setUp();
        \Artisan::call('migrate',['-vvv' => true]);
        \Artisan::call('passport:install',['-vvv' => true]);
        \Artisan::call('db:seed',['-vvv' => true]);
    }

    ...

    /**
     * @test
     */
    public function a_user_has_tokens_removed_when_logged_out()
    {

        // login
        $this->withoutExceptionHandling();
        $user = factory('App\User')->create();

        $response = $this->post('/api/login', [
            'username' => $user->email,
            'password' => 'password'
        ]);

        $token = json_decode($response->getContent())->access_token;
        $this->assertTrue(!$user->tokens->isEmpty());

        // logout
        Passport::actingAs($user, ['*']);

        $logout = $this->json('POST', 'api/logout')->withHeaders([
            'Accept' => 'application/json',
            'Authorization' => 'Bearer ' . $token  
        ]);

        $this->assertTrue($user->tokens->isEmpty());



    }

首先,我创建一个用户并将他们登录,以便创建一个令牌并与他们的用户帐户相关联。

我在点击登录路由后断言令牌存在,它通过了。

然后我调用注销路由,这将删除用户拥有的所有令牌:

    public function logout() {

        auth()->user()->tokens()->each(function($token, $key) {
            $token->delete();
        });

        return response()->json('Logged out successfully', 200);

    }

路由/api.php

Route::middleware('auth:api')->post('logout', 'AuthController@logout');

上面测试的这个断言失败了:

$this->assertTrue($user->tokens->isEmpty());

如果我在断言之前执行dd($user->tokens); 以检查发生了什么,则令牌会显示 - 它仍然存在。

但是,如果我使用 Postman 访问这条 api/logout 路由,它的所有内容都存储在 MySQL 中,那么所有令牌都将被成功删除。

我不明白发生了什么以及为什么这个测试失败了。或者更确切地说,我不明白为什么$token->delete() 在测试中不起作用,而是通过邮递员起作用。有什么不同?

【问题讨论】:

  • 注销后尝试重新加载用户关系。例如$this->assertTrue($user->fresh()->tokens->isEmpty())
  • @levi - 通过了。我不知道那个模型方法,所以我必须查一下。您能留下答案,以便我投票并接受吗?

标签: laravel testing laravel-passport


【解决方案1】:

在执行断言之前,通过$user->fresh()重新加载user模型关系,以确保删除的关系反映在实例中。

我不知道为什么,但在测试环境中,这不是自动完成的。

【讨论】:

  • 我希望这次测试是值得的,并且我可以在路上获得这些时间:)。谢谢您的帮助。我不知道那个模型方法或者那是一回事。
  • @good_afternoon 我也没有,直到我遇到了和你一样的问题。
猜你喜欢
  • 2018-07-29
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2020-06-19
  • 2019-08-25
  • 2021-09-11
  • 2018-02-20
  • 2021-10-06
相关资源
最近更新 更多