登録処理のテストをしているのですが、factoryを実行すると
下記のエラーが表示されます。
PHPUnit/Framework/ExpectationFailedException with message 'Failed asserting that a row in the table [items] matches the attributes { "user_id": 1
解決したいこと データベースに値を保存出来るようにし、assertDatabaseHasを使えるようにしたい。
現状 エラーから判断するとデータベースに値を保存出来ていないので、assertDatabaseHasが使えないと見ています。データベースはテスト用のものを使用しています。responseの中にCSRF token mismatch.が気になります。
参考ファイル
feature
1public function test_ログインしていれば投稿ページに行ける() 2{ 3 $user = factory(User::class)->create(); 4 $response = $this->actingAs($user)->get(route('items.create')); 5 $response->assertStatus(200); 6} 7 8public function test_ログインしていれば投稿出来る() 9{ 10 response = $this->post(route('items.store'), [factory(Item::class)]); 11 $this->assertDatabaseHas('items', ['user_id' => 1]); 12 $response->assertStatus(200); 13}
factories
1<?php 2 3/** @var \Illuminate\Database\Eloquent\Factory $factory */ 4 5use App\Item; 6use App\User; 7use Faker\Generator as Faker; 8 9$factory->define(Item::class, function (Faker $faker) { 10 return [ 11 'user_id' => function() { 12 return User::where('id', 1)->first()->id; 13 }, 14 'user_id' => 1, 15 'age' => 3, 16 'sex' => 2, 17 'area' => 5, 18 'cat' => 3, 19 'title' => $faker->text, 20 'content' => $faker->name, 21 'status' => 3, 22 ]; 23}); 24
factories
1<?php 2 3/** @var \Illuminate\Database\Eloquent\Factory $factory */ 4 5use App\User; 6use Faker\Generator as Faker; 7use Illuminate\Support\Str; 8 9 10$factory->define(User::class, function (Faker $faker) { 11 12 return [ 13 'name' => $faker->name, 14 'email' => $faker->unique()->safeEmail, 15 'email_verified_at' => now(), 16 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 17 'remember_token' => Str::random(10), 18 ]; 19}); 20
model
1itemモデル 2public function user() 3{ 4 return $this->belongsTo('App\User'); 5} 6 7userモデル 8public function items() 9{ 10 return $this->hasMany('App\Item'); 11}
migration
1public function up() 2{ 3 Schema::create('items', function (Blueprint $table) { 4 $table->id(); 5 $table->foreignId('user_id')->constrained('users')->onDelete('cascade'); 6 $table->string('title'); 7 $table->text('content'); 8 $table->integer('age')->nullable(); 9 $table->integer('sex')->nullable(); 10 $table->integer('area')->nullable(); 11 $table->integer('cat')->nullable(); 12 $table->integer('status')->default(0); 13 $table->timestamps(); 14 }); 15} 16
view
1<form method="POST" action="{{ route('items.store') }}" enctype="multipart/form-data"> 2 @csrf 3 省略 4</form>
userマイグレーションファイルは初期値です。
試したこと
0, 普通に値が保存できるか。 1, php artisan migrate:fresh --env=testing 2, php artisan cache:clear php artisan config:clear php artisan config:cache 3, マイグレーションファイルの型、モデルファイルのアソシエーション。 4, $responseの中身確認。下記が表示されました。 message: "CSRF token mismatch.", -> @csrfは書いているのになぜ?
CSRF token mismatchがresponseに含まれていることは確認しましたが、普通に登録が出来、@csrfも記載しているところで、仮説が尽きてしまいました。
どなたかお分かりになる方いましたらご教授ください。
よろしくお願いいたします。
laravel7.x
あなたの回答
tips
プレビュー