#環境
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>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/06 13:51
2020/03/06 14:13
2020/03/06 14:21