PHPUnitで「Error : Call to a member function connection() on null」

  • 2020/06/10
  • 2020/06/10
  • PHP
PHP php

PHPのフレームワークでるLaravelでUnit Testを実装する際にエラーが発生しました。
解決策は単純だったのですが気づくのに時間がかかったので対応を記録しておきます。
エディタはPhpStorm、フレームワークはLaravel7です。

Unit Testの設定

phpunit.xml

Unit TestにはデフォルトのSQLiteではなくMySQLを使いました。
また、スキーマ名を変更します。

<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"/> <!-- mysqlに変更 -->
    <server name="DB_DATABASE" value="sample_unit"/> <!-- テスト用DBに変更 -->
    <server name="MAIL_MAILER" value="array"/>
    <server name="QUEUE_CONNECTION" value="sync"/>
    <server name="SESSION_DRIVER" value="array"/>
    <server name="TELESCOPE_ENABLED" value="false"/>
</php>

.env.testing

.env.exampleファイルをコピーし、.env.testingファイルを作成します。
そして、APP_ENVとDB接続定義を変更します。

APP_NAME=Laravel
APP_ENV=testing #localからtestingに変更
…
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sample_unit #スキーマ名を変更
DB_USERNAME=root
DB_PASSWORD=パスワード #パスワードを設定

.envファイルを設定したので一応以下を実行します。

$ php artisan config/clear

テストクラス

以下のような簡単なテストクラスを作ってみました。
※PhpStormの新規作成で「PHPUnitテスト」を選択してひな形を作成

namespace Tests\Unit;

use App\Sample;
use PHPUnit\Framework\TestCase;

class SampleTest extends TestCase
{
    public function testDatabase()
    {
        $count = Sample::count();
        self::assertSame(0, $count);
    }
}

PhpStormからUnit Testを実行してみると以下のエラーが発生しました。
なぜ?

Error : Call to a member function connection() on null

エラーの原因

Unit Testのクラスのひな形のTestCaseが別のクラスを指していることが原因でした。
正しくはこうです。

namespace Tests\Unit\Repositories;

use App\Sample;
use Tests\TestCase; // 原因はココ(PHPUnit\Framework\TestCaseは使っちゃダメ)

class SampleTest extends TestCase
{
    public function testDatabase()
    {
        $count = Sample::count();
        self::assertSame(1, $count);
    }
}

phpunit.xmlや.env.testingを見直しましたが全然関係なかったです。
わかってしまえば簡単ですが、原因に気づくまで半日無駄にしました…
みなさんのお役に立てば幸いです。