Lỗi 302 khi viết unit test cho API Laravel
Mình đang tập viết API và mọi thứ chạy ổn rồi, hiện tại mình đang viết unit test cho API thì nó trả về lỗi 302, mình nghĩ là do chưa có access token nên auth nó đẩy về trang đăng nhập. Mọi người có cách nào giải quyết cái access token này trong khi viết test không nhỉ?
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Exceptions\AppException;
use Tests\Api;
class TicketTest extends TestCase
{
public function testGetAllTicketsWithMiddleware()
{
$response = $this->json('get', '/api/tickets');
$response->assertStatus(401);
}
// Đoạn này đang bị return 302
public function testGetAllTickets()
{
$user = factory(\App\Models\User::class)->create();
$response = $this->actingAs($user, 'api')
->json('GET', '/api/tickets');
$response->assertStatus(200)
->assertJson([
'code' => AppException::ERR_NONE,
]);
}
}
1 CÂU TRẢ LỜI
Mình đoán trong file route api bạn đang để
Route::middleware('auth:api')
đúng không ?
Mình nghĩ giờ chỉ cần vô hiệu hóa middleware là ok
Cách 1: Ở Laravel 5.3 có trait là WithoutMiddleware
mình k biết trong version mới còn sử dụng được không nữa :-s
https://laravel.com/docs/5.2/testing#disabling-middleware
Cách 2: Xử lí ở app/Http/Middleware/VerifyCsrfToken.php
viết thêm 1 function xử lí là handle()
public function handle($request, Closure $next)
{
if (env('APP_ENV') === 'testing') {
return $next($request);
}
return parent::handle($request, $next);
}
Điều này sẽ ghi đè phương thức handle bên trong Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
thank bạn, tối về mình thử xem sao, mình cũng nghĩ là cái middleware auth api đấy nhưng lại chưa tìm đc cách để ko cần bỏ nó đi
5.7 vẫn dùng được trait WithoutMiddleware nhé, ai bị như mình thì cho vào là được
@TuanAnh9996 Goodjob =)) Nhưng mình thấy cách 2 clear hơn
@huusu1996 à mình đang làm demo thôi nên dùng tạm cách 1, yêu cầu ko có đoạn này, mình cho thêm thôi