プログラミング初学者です。
Laravelでtddをやってみようしたらつまずきました。
#環境
ホストOSはWindowsで、Dockerで開発をしています。
Laravel 8.15.0
php 7.3.27
開発用dbとは別にテスト用dbのコンテナを作ってあります。
#質問内容
ユーザーを新規登録する機能をテストを書きながら実装しようとしましたが、テストが通らず、その原因がわからないので教えていただきたいです。
#やったこと
ユーザーの新規登録の際に項目を増やして登録させたかったので、Laravelに最初から存在していたapp/Http/Controllers/Auth/RegisteredUserController.php
の中身を項目だけ増やしてUserController.php
に移しました。
RegisteredUserController
1<?php 2 3namespace App\Http\Controllers\Auth; 4 5use App\Http\Controllers\Controller; 6use App\Models\User; 7use App\Providers\RouteServiceProvider; 8use Illuminate\Auth\Events\Registered; 9use Illuminate\Http\Request; 10use Illuminate\Support\Facades\Auth; 11use Illuminate\Support\Facades\Hash; 12 13class RegisteredUserController extends Controller 14{ 15 /** 16 * Display the registration view. 17 * 18 * @return \Illuminate\View\View 19 */ 20 public function create() 21 { 22 return view('auth.user.register'); 23 } 24 25 /** 26 * Handle an incoming registration request. 27 * 28 * @param \App\Http\Requests\LoginRequest $request 29 * @return \Illuminate\Http\RedirectResponse 30 * 31 * @throws \Illuminate\Validation\ValidationException 32 */ 33 public function store(Request $request) 34 { 35 $request->validate([ 36 'name' => 'required|string|max:255', 37 'email' => 'required|string|email|max:255|unique:users', 38 'password' => 'required|string|confirmed|min:8', 39 ]); 40 41 Auth::login($user = User::create([ 42 'name' => $request->name, 43 'email' => $request->email, 44 'password' => Hash::make($request->password), 45 ])); 46 47 event(new Registered($user)); 48 49 return redirect(RouteServiceProvider::HOME); 50 } 51}
UserController
1<?php 2 3namespace App\Http\Controllers; 4 5use App\Models\User; 6use Illuminate\Support\Facades\Auth; 7use Illuminate\Support\Facades\Hash; 8use Illuminate\Http\Request; 9 10class UserController extends Controller 11{ 12 public function add() 13 { 14 return view('auth.user.create'); 15 } 16 17 /** 18 * @param \App\Http\Requests\LoginRequest $request 19 * @return \Illuminate\Http\RedirectResponse 20 */ 21 public function create(Request $request) 22 { 23 Auth::login($user = User::create([ 24 'user_name' => $request->user_name, 25 'birthday' => $request->birthday, 26 'sex' => $request->sex, 27 'former_job' => $request->former_job, 28 'job' => $request->job, 29 'school_id' => $request->school_id, 30 'email' => $request->email, 31 'password' => Hash::make($request->password), 32 ])); 33 34 return redirect('top'); 35 } 36} 37
そしてUserController
をテストしたかったので、tests/Feature/RegistrationTest.php
を参考にしてUserControllerTest.php
を作りました。
RegistrationTest
1<?php 2 3namespace Tests\Feature; 4 5use App\Providers\RouteServiceProvider; 6use Illuminate\Foundation\Testing\RefreshDatabase; 7use Tests\TestCase; 8 9class RegistrationTest extends TestCase 10{ 11 use RefreshDatabase; 12 13 public function test_registration_screen_can_be_rendered() 14 { 15 $response = $this->get('/register'); 16 17 $response->assertStatus(200); 18 } 19 20 public function test_new_users_can_register() 21 { 22 $response = $this->post('/register', [ 23 'name' => 'Test User', 24 'email' => 'test@example.com', 25 'password' => 'password', 26 'password_confirmation' => 'password', 27 ]); 28 29 $this->assertAuthenticated(); 30 $response->assertRedirect(RouteServiceProvider::HOME); 31 } 32}
UserControllerTest
1<?php 2 3namespace Tests\Feature; 4 5use App\Models\User; 6use Illuminate\Foundation\Testing\RefreshDatabase; 7use Illuminate\Foundation\Testing\WithFaker; 8use Illuminate\Foundation\Testing\WithoutMiddleware; 9use Tests\TestCase; 10 11class UserControllerTest extends TestCase 12{ 13 use RefreshDatabase; 14 15 /** 16 * ユーザー登録フォームにアクセス出来るかテスト 17 * 18 * @return void 19 */ 20 public function testAdd() 21 { 22 $response = $this->get('/signup'); 23 24 $response->assertStatus(200); 25 } 26 27 /** 28 * ユーザーの新規作成をテスト 29 * @return void 30 */ 31 public function testCreate() 32 { 33 $user = [ 34 'user_name' => '田中 太郎', 35 'birthday' => '2013-5-30 00:00:00.000000', 36 'sex' => 2, 37 'former_job' => '公務員', 38 'job' => 'エンジニア', 39 'school_id' => 1, 40 'email' => 'test@gmail.com', 41 'password' => 'password1', 42 'password_confirmation' => 'password1', 43 ]; 44 45 $response = $this->post('/users/create', $user); 46 47 $this->assertAuthenticated(); 48 $response->assertRedirect('top'); 49 } 50}
ルーティングは以下の通りです。
web
1<?php 2 3use Illuminate\Support\Facades\Route; 4use App\Http\Controllers\UserController; 5use App\Http\Controllers\HomeController; 6 7/* 8|-------------------------------------------------------------------------- 9| Web Routes 10|-------------------------------------------------------------------------- 11| 12| Here is where you can register web routes for your application. These 13| routes are loaded by the RouteServiceProvider within a group which 14| contains the "web" middleware group. Now create something great! 15| 16*/ 17Route::middleware(['guest'])->group(function() { 18 Route::get('/', [HomeController::class, 'index'])->name('top'); 19 Route::get('/signup', [UserController::class, 'add'])->name('add'); 20 Route::post('/users/create', [UserController::class, 'create'])->name('create'); 21}); 22 23require __DIR__.'/auth.php';
テストを実行するとtestCreate
が失敗しました。
FAIL Tests\Feature\UserControllerTest ✓ add ⨯ create --- • Tests\Feature\UserControllerTest > create The user is not authenticated Failed asserting that false is true. at tests/feature/UserControllerTest.php:47 43▕ ]; 44▕ 45▕ $response = $this->post('/users/create', $user); 46▕ ➜ 47▕ $this->assertAuthenticated(); 48▕ $response->assertRedirect('top'); 49▕ } 50▕ 51▕ /** Tests: 1 failed, 1 passed Time: 6.54s
testCreate
の$this->assertAuthenticated();
の行をコメントアウトしてテストすると以下のようになります。
FAIL Tests\Feature\UserControllerTest ✓ add ⨯ create --- • Tests\Feature\UserControllerTest > create Response status code [419] is not a redirect status code. Failed asserting that false is true. at tests/feature/UserControllerTest.php:48 44▕ 45▕ $response = $this->post('/users/create', $user); 46▕ 47▕ // $this->assertAuthenticated(); ➜ 48▕ $response->assertRedirect('top'); 49▕ } 50▕ 51▕ /** 52▕ * ユーザー編集フォームにアクセス出来るかテスト Tests: 1 failed, 1 passed Time: 6.56s
ステータスコード419が返ってきているようですが、公式ドキュメントにはテスト実行時に、CSRFミドルウェアはすべてのルートで自動的に無効になります。
との記述があるので、原因は別なのではないかと思います。
思いつく限りの手段を試しましたが、3日間いろいろやっても改善しませんでした。
初学者の考えでは限界を感じたのでお力添えいただきたいです。
質問の仕方に不備も多いかと思いますが、よろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/09 13:00