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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

ユニットテスト

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

Q&A

解決済

1回答

8174閲覧

データベースに値は存在している? が、詳細ページにアクセスすると404が返ってきてしまいます。(テスト)

tenlife

総合スコア70

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

ユニットテスト

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

0グッド

0クリップ

投稿2020/10/22 22:00

laravelでテストを実装しています。

factoryで作ったitemの詳細ページ移動したいのですが、404のエラーが返ってきてしまいます。
データベースはテスト用のものを作り使用しています。

解決したい事: レスポンスが200を返すようになる事です。

現状の理解: 下記記載の6の部分で値が取得出来ていないのが怪しいと見ています。しかし、RefreshDatabaseを外すと値は保存出来ている事を確認しました。

エラーコード、関連ファイル

error

11) Tests\Feature\ItemManagement::test_ログインしていなくても詳細ページに遷移出来る 2Expected status code 200 but received 404. 3Failed asserting that 200 is identical to 404. 4 5$responseを確認 6#message: "No query results for model [App\Item] 11",
<?php namespace Tests\Feature; use App\Item; use App\User; use Illuminate\Foundation\Testing\RefreshDatabase; use Tests\TestCase; class ItemManagement extends TestCase { use RefreshDatabase; public function setUp(): void { parent::setUp(); $this->user = factory(User::class)->create(); $this->item = factory(Item::class)->create(['user_id' => $this->user->id]); } public function test_ログインしていなくても詳細ページに遷移出来る() { // データベースに存在するか確認しています      $this->assertDatabaseHas('users', ['id' => $this->user->id]); $this->assertDatabaseHas('items', ['id' => $this->item->id]); $response = $this->get(route('items.show', ['item' => $this->item->id])); $response->assertStatus(200); $response->assertDontSee('編集', '削除'); } }

databasephp

1変更点のみ 2 3'mysql_testing' => [ 4 'database' => 'test_AppName', 5],

phpunit

1変更点のみ 2 3<server name="DB_CONNECTION" value="mysql_testing"/> 4<server name="DB_DATABASE" value="test_AppName"/> 5<server name="DB_HOST" value="127.0.0.1"/>

factory

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 factory(User::class)->create()->id; 13 }, 14 'title' => $faker->name, 15 'content' => $faker->text, 16 ]; 17});

env

1env.testing ファイルです。変更点のみ 2 3APP_ENV=test

web

1Route::resource('items', 'ItemController');

試した事、確認した事

0, php artisan route:listでパスの確認。 -> 一致。
1, 普通に詳細ページにアクセス出来るか? -> 出来る。
2, testデータベース作り直し
3, php artisan config:clear
4, ちゃんとenv.testingを見てくれているか確認。下記のコード。 -> 見てくれてそう。

dd(env('APP_ENV'), env('DB_HOST'), env('DB_DATABASE'), env('DB_CONNECTION')); parent::setUp(); ^ "testing" ^ "127.0.0.1" ^ "test_AppName" ^ "mysql_testing"

5, RefreshDatabaseトレイト外したらデータベースに値は保存できてるか? -> 保存されてる。
6, 処理をeval(\Psy\sh());で止めて値を取得出来るか確認。 -> 取れない。

>>> $items = Item::get() => Illuminate\Database\Eloquent\Collection {#1538} >>> $items->count() => 0

7, 他のアプリで試してみる。 -> 同じコードで通りました。6の部分では値も取得できました。

上記から

$this->assertDatabaseHasでも直前で値がある事は確認出来ているのですが、なぜかアクセスする時には404になってしまいます。
他のアプリで確認したところ違いがあったのは6,7番目の部分でした。

上記を確認しましたが解決する事が出来ず、仮説が尽きてしました。
どなたかお分かりになる方、確認した方が良いところの心当たりがある方、是非知恵を貸していただきたいです。

よろしくお願いいたします。

PHP 7.4.8
Laravel 7.x

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

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

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

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

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

m.ts10806

2020/10/22 22:48 編集

App\Item のコードを提示してください(できればApp\Userも) あとマークダウンcodeの冒頭は基本的に言語名を指定します。ファイル名ではありません。 ```php ```html など。
m.ts10806

2020/10/22 22:58

ただ、「ブラウザからアクセスして404」なのであれば、URL間違っているか対応するルーティングがないだけなのでは。
tenlife

2020/10/22 23:36

指摘ありがとうございます。モデルファイルを見ているうちにscopeを設定していた事に気づきfactoryの記載を変更すると処理が通るようになりました。 ありがとうございました。
m.ts10806

2020/10/22 23:43

質問は編集できるので、適宜調整してください。 あまり私がピンときてないのですが、解決されたようで何よりです。
guest

回答1

0

自己解決

指摘いただいた通りitemモデルでscopeを設定していたので、その部分で引っかかってしまい404になってしまっていました。
statusが1のみを通しているのにfactoryでは3で作っていました。。。。

factoryの作成部分を3から1に変更するとうまく処理が通りました。

$factory->define(Item::class, function (Faker $faker) { return [ 'user_id' => function() { return factory(User::class)->create()->id; }, 'age' => 3, 'sex' => 2, 'area' => 5, 'cat' => 3, 'title' => '$faker->text', 'content' => $faker->name, // 3から1に変更 'status' => 1, ]; });

Item

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6use App\Scopes\ScopeItem; 7 8class Item extends Model 9{ 10 protected $fillable = ['user_id', 'title', 'content', 'age', 'sex', 'area', 'cat', 'status']; 11 12 protected static function boot() 13 { 14 parent::boot(); 15 static::addGlobalScope(New ScopeItem); 16 } 17}

Scope

1<?php 2namespace App\Scopes; 3 4use Illuminate\Database\Eloquent\Scope; 5use Illuminate\Database\Eloquent\Model; 6use Illuminate\Database\Eloquent\Builder; 7 8class ScopeItem implements Scope 9{ 10 public function apply(Builder $builder, Model $model) 11 { 12 $builder->where('status', '1'); 13 } 14}

*7で作ったものはすこーぷがいなかったので通ってたんですね。

盲点でした。

投稿2020/10/22 23:35

tenlife

総合スコア70

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問