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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

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

PHP

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

ユニットテスト

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

Q&A

解決済

1回答

1569閲覧

Laravelで~/tests/Unit以下でjson_encode()を行った時と~/app以下でjson_encode()を行った時の結果が異なり、テストにならない

SanQ

総合スコア92

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

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

PHP

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

ユニットテスト

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

0グッド

0クリップ

投稿2020/05/26 10:11

#開発環境

ツールバージョン
PHP7.3.18
Laravel7.12.0

#困っていること
自分は現在このような機能を作成しています。

  • 文字列の入力値を引数にとる。
  • 入力値からDBのあるテーブル内のレコードを全て取り出す。
  • 取り出したデータをjson形式にして返す。

この機能のテストを行うためにこのようなテストを行いました。(ちなみにテスト対象のファイルは~/app/Model/User/SignIn.phpというファイルで、テスト行うファイルは~/tests/Unit/OAuth/ModelTest.phpというファイルです。)

  1. あらかじめDBの該当のテーブルへデータを入れておく。
  2. 該当のテーブル内のデータを全て取り出し、json_encode()でjson形式にし、変数へ代入する。
  3. テスト対象の関数へあらかじめDBへ入れたデータの一部を受け渡し、結果を変数へ代入する。
  4. 2、3で得られた変数を比べ、両方とも値が同じになるか確かめる。

そしてテストの確認を行うと、テスト対象の結果は成功にもかかわらずテスト内で行われたjson_encode()の結果が通常と異なるため、テストが正常に行われませんでした。

どうしたらテスト環境でもjson_encode()が正常に作動するのでしょうか?

#エラー内容
テーブルのカラムがgmailなのにそこに入る値がgmail.comではないじゃないか、と思われるかもしれませんが今回の機能ではgmail.com以外のメールアドレスでも正常に動くようになっていますので、気にしないでください。

terminal

1 RUNS Tests\Unit\OAuth\ModelTest 2 • sign in test 3 4 Tests: 1 pending 5sh: 1: gmail: not found 6 7 FAIL Tests\Unit\OAuth\ModelTest 8 ✕ sign in test 9 10 Tests: 1 failed 11 12 Failed asserting that two strings are equal. 13 14 at tests/Unit/OAuth/ModelTest.php:90 15 86| $testData = json_encode($dataArray); 16 87| 17 88| $jsonData = SignIn::signIn($data->gmail); 18 89| 19 > 90| $this->assertEquals($jsonData, $testData); 20 91| } 21 92| } 22 93| 23 24--- Expected 25+++ Actual 26@@ @@ 27-'{"id":1,"gmail":"felicity.kovacek@lindgren.com","name":"Andres Schamberger","profile":null,"icon":null,"best":null,"safety":1}' //正常に機能している 28+'{"uid=0(root) gid=0(root) groups=0(root)\n":1,"":1}' //正常に機能していない

#テスト対象のファイルのコードとテストコード

テスト対象のファイル(~/app/Model/User/SignIn.php

php

1<?php 2declare(strict_types=1); 3 4namespace App\Model\User; 5 6use App\Eloquent\GoogleUser; 7use Illuminate\Support\Facades\DB; 8 9final class SignIn 10{ 11 static function signIn(string $info) 12 { 13 $eloquent = DB::table('google_users')->where('gmail', $info)->first(); 14 15 $dataArray = [ 16 'id' => $eloquent->id, 17 'gmail' => $eloquent->gmail, 18 'name' => $eloquent->name, 19 'profile' => $eloquent->profile, 20 'icon' => $eloquent->icon, 21 'best' => $eloquent->best, 22 'safety' => $eloquent->safety, 23 ]; 24 25 $jsonData = json_encode($dataArray); 26 return $jsonData; 27 } 28}

テストを行うファイル(~/tests/Unit/OAuth/ModelTest.php

php

1<?php 2 3namespace Tests\Unit\OAuth; 4 5use Tests\TestCase; 6use Illuminate\Foundation\Testing\RefreshDatabase; 7use Illuminate\Support\Facades\DB; 8use App\Eloquent\GoogleUser; 9use App\Model\User\SignIn; 10 11class ModelTest extends TestCase 12{ 13 use RefreshDatabase; 14 15 /** 16 * Sign in test. 17 * @test 18 * 19 * @return void 20 */ 21 public function signInTest() 22 { 23 factory(GoogleUser::class, 1)->create(); 24 25 $data = DB::table('google_users')->where('id', '1')->first(); 26 27 $dataArray = [ 28 `id` => $data->id, 29 `gmail` => $data->gmail, 30 `name` => $data->name, 31 `profile` => $data->profile, 32 `icon` => $data->icon, 33 `best` => $data->best, 34 `safety` => $data->safety, 35 ]; 36 $testData = json_encode($dataArray); 37 38 $jsonData = SignIn::signIn($data->gmail); 39 40 $this->assertEquals($jsonData, $testData); 41 } 42} 43?>

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

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

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

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

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

guest

回答1

0

ベストアンサー

テストクラスの連想配列$dataArrayのキーがバッククォートでくくられているからではないでしょうか。書式エラーで想定外の動作になるかと。。。

$dataArray = [ `id` => $data->id, `gmail` => $data->gmail, `name` => $data->name, `profile` => $data->profile, `icon` => $data->icon, `best` => $data->best, `safety` => $data->safety, ];

SignInクラスでの定義のように、シングルクォーテーションでくくれば動くと思います。

投稿2020/05/26 13:24

編集2020/05/26 13:26
tdomy

総合スコア20

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

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

SanQ

2020/05/26 13:38

おっしゃる通りでした。教えてくださり本当にありがとうございます。 それにしてもとても恥ずかしい、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問