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

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

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

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

PHP

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

Q&A

解決済

1回答

2068閲覧

LaravelのUnitテストでテスト対象のクラスが読み込まれない

SanQ

総合スコア92

Laravel

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

PHP

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

0グッド

0クリップ

投稿2020/03/06 13:12

#環境
Laravel Framework 6.17.1
mysql Ver 8.0.19 for Win64 on x86_64 (MySQL Community Server - GPL)

#テストの内容
laravel_testingというデータベースと結びついたクラスを使用してtemple_usersというテーブルへ値を入れる機能を持つクラスへ、あらかじめ決められている値を代入し、実際にデータベースにその値が入っているかを確かめる。

#困っていること
DBを使用したLaravelのUnitテストを行ったところ、以下のエラーが出た。
自己解決しようと様々なサイトで問題の原因とその解決策を探したが、原因がこのテストで扱っているModelクラスが読み込まれていないからではないか、という推測ぐらいしかできなかった。
あと、テスト対象のクラスは実際のアプリケーションに実装したらうまく動いたがテストではうまく動かなかった。

#実際のエラー

PS C:\Apache24\htdocs\temple\temple> .\vendor\bin\phpunit .\tests\Unit\User\EloquentTest.php PHPUnit 8.5.2 by Sebastian Bergmann and contributors. E 1 / 1 (100%) Time: 812 ms, Memory: 6.00 MB There was 1 error: 1) Tests\Unit\User\EloquentTest::eloquent Error: Call to a member function connection() on null C:\Apache24\htdocs\temple\temple\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:1255 C:\Apache24\htdocs\temple\temple\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:1221 C:\Apache24\htdocs\temple\temple\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:1051 C:\Apache24\htdocs\temple\temple\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:968 C:\Apache24\htdocs\temple\temple\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:646 C:\Apache24\htdocs\temple\temple\app\User\Register.php:26 C:\Apache24\htdocs\temple\temple\tests\Unit\User\EloquentTest.php:30 ERRORS! Tests: 1, Assertions: 0, Errors: 1.

#実際のコード
##テストコード
Tests\Unit\User\EloquentTest.php

<?php namespace Tests\Unit\User; use PHPUnit\Framework\TestCase; use App\User\Register; use Illuminate\Foundation\Testing\RefreshDatabase; class EloquentTest extends TestCase { use RefreshDatabase; protected $data = []; /** * * @test */ public function eloquent(): void { $data = [ 'name' => '参釜琉', 'furigana' => 'サンプル', 'email' => 'fogefoge@gmail.com', 'password' => 'passpass' ]; $register = new Register($data); $register->createDB(); $this->assertDatabaseHas('temple_users',[ 'id' => '1', 'name' => $data['name'], 'furigana' => $data['furigana'], 'email' => $data['email'], ]); } }

##テスト対象のクラス
App\Eloquent\User\TempleUser.php(laravel_testingというDB内のtemple_usersテーブルに結びついている)

<?php namespace App\Eloquent\User; use Illuminate\Database\Eloquent\Model; class TempleUser extends Model { protected $fillable = [ 'name', 'furigana', 'email', 'password' ]; } ?>

App\User\Register.php(DBの作成を行う)

<?php namespace App\User; use App\Eloquent\User\TempleUser; class Register { public function __construct(array $data) { $this->name = $data['name']; $this->furigana = $data['furigana']; $this->email = $data['email']; $this->password = $data['password']; } public function createDB() { $user = new TempleUser; $user->name = $this->name; $user->furigana = $this->furigana; $user->email = $this->email; $user->password = password_hash($this->password, PASSWORD_DEFAULT); $user->save(); } } ?>

##Unitテストの設定
phpunit.xml

<?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true"> <testsuites> <testsuite name="Unit"> <directory suffix="Test.php">./tests/Unit</directory> </testsuite> <testsuite name="Feature"> <directory suffix="Test.php">./tests/Feature</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">./app</directory> </whitelist> </filter> <php> <server name="APP_ENV" value="testing"/> <server name="BCRYPT_ROUNDS" value="4"/> <server name="CACHE_DRIVER" value="array"/> <server name="DB_CONNECTION" value="mysql"/> <server name="DB_DATABASE" value="laravel_testing"/> <server name="MAIL_DRIVER" value="array"/> <server name="QUEUE_CONNECTION" value="sync"/> <server name="SESSION_DRIVER" value="array"/> </php> </phpunit>

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

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

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

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

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

guest

回答1

0

ベストアンサー

use PHPUnit\Framework\TestCase; の部分をuse Tests\TestCase; とすることで変化ないでしょうか。

PHPUnit\Framework\TestCase はPHPUnitに入っているクラスで、Tests\TestCaseはそれを継承したLaravel用のクラスになります。

投稿2020/03/06 13:45

Eggpan

総合スコア3205

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

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

SanQ

2020/03/06 13:51

上手くいきました! 結構悩んでいたので助かりました! ちなみに「PHPUnit\Framework¥TestCase」は何のためにあるのでしょうか?
Eggpan

2020/03/06 14:13

PHPUnitというパッケージが元々ありまして、Laravelは内部でこれを利用しています。 PHPUnitに元々あるクラスがPHPUnit\Framework\TestCaseになります。 Laravelはこのクラスを継承して、Tests\TestCaseとして定義しています。 Laravelのテストで使うのであれば、直接PHPUnit\Framework\TestCaseを使うことはないかと思います。
SanQ

2020/03/06 14:21

回答ありがとうございます。 自分がテストクラスで継承していたのは、PHPUnitパッケージ内のTestCaseだったからLaravel特有の関数が使えなかったということですね。 勉強になりました。 ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問