Laravel 测试失败,但适用于邮递员
Laravel test fails, but works on postman
我对用户注销并删除了他们的令牌进行了测试。
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);
}
routes/api.php
Route::middleware('auth:api')->post('logout', 'AuthController@logout');
上述测试的断言失败:
$this->assertTrue($user->tokens->isEmpty());
如果我在断言之前执行 dd($user->tokens);
以检查发生了什么,令牌就会出现 - 它仍然存在。
但是如果我使用 Postman 访问这条 api/logout
路由,它的所有内容都存储在 MySQL 中,所有标记都将被成功删除。
我不明白这是怎么回事,也不明白为什么这个测试失败了。或者更确切地说,我不明白为什么 $token->delete()
在测试中不起作用,但通过 Postman 起作用。有什么不同?
在执行断言之前,通过$user->fresh()
重新加载user
模型关系,以确保删除的关系反映在实例中。
我不知道为什么,但在测试环境中,这不是自动完成的。
我对用户注销并删除了他们的令牌进行了测试。
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);
}
routes/api.php
Route::middleware('auth:api')->post('logout', 'AuthController@logout');
上述测试的断言失败:
$this->assertTrue($user->tokens->isEmpty());
如果我在断言之前执行 dd($user->tokens);
以检查发生了什么,令牌就会出现 - 它仍然存在。
但是如果我使用 Postman 访问这条 api/logout
路由,它的所有内容都存储在 MySQL 中,所有标记都将被成功删除。
我不明白这是怎么回事,也不明白为什么这个测试失败了。或者更确切地说,我不明白为什么 $token->delete()
在测试中不起作用,但通过 Postman 起作用。有什么不同?
在执行断言之前,通过$user->fresh()
重新加载user
模型关系,以确保删除的关系反映在实例中。
我不知道为什么,但在测试环境中,这不是自动完成的。