質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Q&A

0回答

1317閲覧

テストをしても値を保存出来ず、assertDatabaseHasがうまく使えていない。

tenlife

総合スコア70

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

0グッド

0クリップ

投稿2020/10/18 00:28

編集2020/10/19 04:52

登録処理のテストをしているのですが、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問