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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

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

PHPUnit

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

Q&A

解決済

1回答

1299閲覧

PHPUnitでのテストにおいて登録を確認するテストのresponseが上手くいかず、エラーが出てしまう

Maruco2321

総合スコア118

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

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

PHPUnit

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

0グッド

0クリップ

投稿2022/03/09 22:57

編集2022/03/10 11:06

マルチポストしているのですが質問内容などは随時記述して行きたいと思いますのでよろしくお願いします。

MacOSで

  • PHP 7.4.1
    • Laravel 6.20.26
    • PHPUnit 9.5.16

のようなバージョンでlaravelとvue.jsでアプリ制作をしています。
PHPunitでテストをした際に
RegisterApiTest.php
が通らない原因がわからないでいます。

RegisterApiTest.phpのコード

コード <?php namespace Tests\Feature; use App\User; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; class RegisterApiTest extends TestCase { use RefreshDatabase; /** * @test */ public function should_新しいユーザーを作成して返却する() { $data = [ 'name' => 'user', 'email' => 'dummy@email.com', 'password' => 'test1234', 'password_confirmation' => 'test1234', ]; (追記2でコメント機能解除) // dd($data); // 会員登録をroutes/api.php にルート定義 // Route::post('/register', 'Auth\RegisterController@register')->name('register'); // コントローラーの影響でここで @register → RegistersUsers トレイトの register メソッド //  → @registeredが必要→registeredを書き込む。これによって$dataが登録用データとして送られる // RegisterController で registered メソッドの中身をオーバーライド // $dataを送る (追記2でコメント機能解除) // dd($response); $response = $this->json('POST', route('register'), $data); $user = User::first(); (1回目のテスト,ここがエディターの37行目に当たります) $this->assertEquals($data['name'], $user->name); (2回目のテストで上を省略) //$this->assertEquals($data['name'], $user->name); $response (ここが2回目のテストにおけるエディターの40行目に当たります) ->assertStatus(201) ->assertJson(['name' => $user->name]); } }

これでテストを試したところ、ターミナルでは

コード(1回目のテスト) root@bf0269c31cae:/var/www/html# ./vendor/bin/phpunit tests/Feature/RegisterApiTest.php PHPUnit 9.5.16 by Sebastian Bergmann and contributors. E 1 / 1 (100%) Time: 00:01.960, Memory: 22.00 MB There was 1 error: 1) Tests\Feature\RegisterApiTest::should_新しいユーザーを作成して返却する ErrorException: Trying to get property 'name' of non-object /var/www/html/tests/Feature/RegisterApiTest.php:37 ERRORS! Tests: 1, Assertions: 0, Errors: 1.

ここからRegisterApiTest.phpの37行目でnameプロパティが、から(null?)なのだろうとまず考えました。
次に問題の37行目をコメント機能で消したところ

コード(2回目のテスト) :/var/www/html# ./vendor/bin/phpunit tests/Feature/RegisterApiTest.php PHPUnit 9.5.16 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 00:03.398, Memory: 22.00 MB There was 1 failure: 1) Tests\Feature\RegisterApiTest::should_新しいユーザーを作成して返却する Expected status code 201 but received 405. Failed asserting that false is true. /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:186 /var/www/html/tests/Feature/RegisterApiTest.php:40 FAILURES! Tests: 1, Assertions: 1, Failures: 1.

このことからresponseが上手く行っていないことからエラーが出るのでは?と判断して、
ルーティングとメゾットを見に行きました。

APIのためにルーティングを少し変更しています

app/Providers/RouteServiceProvider.php を

コード(RouteServiceProvider.php) protected function mapApiRoutes() { Route::prefix('api') // 'api' → 'web' に変更 ->middleware('web') ->namespace($this->namespace) ->group(base_path('routes/api.php')); }

のようにしました

apiに関するルーティングはroutes/api.php(routes/web.phpではありません)に書き込んで

コード(routes/api.php) <?php use Illuminate\Http\Request; // 会員登録 Route::post('/register', 'Auth\RegisterController@register')->name('register');

メゾットはsrc/app/Http/Contorollers/auth/RegisterController.phpの

コード protected function registered(Request $request, $user) { return $user; }

を記述しています
どこで見落としているのかがわからないでいます。よろしくお願いします🙇‍♂️

追記

laravel6.0での
$response = $this->json('POST', route('register'), $data);
の書き方がおかしいのかな?と考えたのですが6系のドキュメントにおいて(https://readouble.com/laravel/6.x/ja/http-tests.html)

コード public function testBasicExample() { $response = $this->json('POST', '/user', ['name' => 'Sally']); $response ->assertStatus(201) ->assertExactJson([ 'created' => true, ]); }

とあったのでここは問題ないと思います

PHPUnit.xml

コード <php> <env name="APP_ENV" value="testing"/> <env name="DB_CONNECTION" value="sqlite_testing"/> <server name="BCRYPT_ROUNDS" value="4"/> <server name="CACHE_DRIVER" value="array"/> <server name="DB_CONNECTION" value="sqlite"/> <server name="DB_DATABASE" value=":memory:"/> <server name="MAIL_DRIVER" value="array"/> <server name="QUEUE_CONNECTION" value="sync"/> <server name="SESSION_DRIVER" value="array"/> </php>

config/database.php

コード 'connections' => [ //追加 'sqlite_testing' => [ 'driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '', ],

追記2
dd()を利用して調べてみたのですがコメントが長すぎることもあるので重要そうな部分を抜粋して載せて行きたいと思います🙇‍♂️dd()の場所とその内容は上記のテストコードにわかりやすいように記述しておきたいと思います。

dd($data);の場合 root@bf0269c31cae:/var/www/html# ./vendor/bin/phpunit tests/Feature/RegisterApiTest.php PHPUnit 9.5.16 by Sebastian Bergmann and contributors. array:4 [ "name" => "user" "email" => "dummy@email.com" "password" => "test1234" "password_confirmation" => "test1234" ] root@bf0269c31cae:/var/www/html# dd($response);の場合 lluminate\Foundation\Testing\TestResponse^ {#1169 +baseResponse: Illuminate\Http\JsonResponse^ {#1209 #data: """ {\n "message": "The POST method is not supported for this route. Supported methods: GET, HEAD.",\n "exception": "Symfony\\Component\\HttpKernel\\Exception\\MethodNotAllowedHttpException",\n "file": "/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php",\n "line": 256,\n "trace": [\n {\n """ #version: "1.0" #statusCode: 405 #statusText: "Method Not Allowed" #charset: null +original: array:5 [ "message" => "The POST method is not supported for this route. Supported methods: GET, HEAD." "exception" => "Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException" "file" => "/var/www/html/vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php" "line" => 256 "trace" => array:32 [ +exception: Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException^ {#1185 -statusCode: 405 -headers: array:1 [ "Allow" => "GET, HEAD" ] #message: "The POST method is not supported for this route. Supported methods: GET, HEAD." #code: 0 #file: "./vendor/laravel/framework/src/Illuminate/Routing/RouteCollection.php" #line: 256 trace: { ./vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:442 { …} ./tests/Feature/RegisterApiTest.php:34 { Tests\Feature\RegisterApiTest->should_新しいユーザーを作成して返却する()^ › // dd($data); › $response = $this->json('POST', route('register'), $data); › arguments: { $method: "POST" $uri: "http://localhost/127.0.0.1/api/register" $data: array:4 [ …4] } } } } #streamedContent: null } root@bf0269c31cae:/var/www/html#

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
追記追記2内の
$uri: "http://localhost/127.0.0.1/api/register"
が明らかにおかしいことに気づきもともと127.0.0.1が記述されている
REDIS_HOST=127.0.0.1を
REDIS_HOST=db(dockerのmysqlに接続)
APP_URL=127.0.0.1を
APP_URL=
にしたらとりあえず通りました。なのでどちらかの127.0.0.1が原因となってurlでおかしくなって通らなかったのだと思われます。ありがとうございました🙇‍♂️

投稿2022/03/10 11:21

Maruco2321

総合スコア118

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問