🐙

PHPUnitで自作関数をテストするときに詰まった話

2022/07/21に公開

詰まったこと

PHPUnit を用いて、自作関数のテストを行おうとしたところ、 関数が定義されていないという旨のエラーが出てきた。

Error: Call to undefined function Sample\sampleMethod()

自作関数

src/Sample.php
<?php

namespace Sample;

function sampleMethod(): bool
{
    return true;
}

テストコード

tests/SampleTest.php
<?php

namespace Tests;

use function Sample\sampleMethod;
use PHPUnit\Framework\TestCase;

class SampleTest extends TestCase
{
    public function testSampleMethod(): void
    {
        $this->assertTrue(sampleMethod());
    }
}

autoload の設定

composer.json
{
  // 省略
  "autoload": {
    "psr-4": {
      "Sample\\": "src/"
    }
  },
  "autoload-dev": {
    "psr-4": {
      "Tests\\": "tests/"
    }
  }
  // 省略
}

原因

PSR-4 で自動ロードされる対象は「クラス」であり、「クラス」ではないファイルはロードされない。

今回作成した sample.php は PSR-4 が指す「クラス」形式ではなかったため、テスト実行時に sample.php は読み込まれなかった。
結果として、sampleMethod() は定義されていないメソッドとなり、エラーが起きた。

解消方法

autoload プロパティの files に対象ファイルのパスを記載することで、ファイルをロードできた。

記述後は composer dump-autoload を必ず実行する。

composer.json
{
  "autoload": {
    "psr-4": {
      "Sample\\": "src/"
    },
    "files": ["src/sample.php"] // 追記
  },
  "autoload-dev": {
    "psr-4": {
      "Tests\\": "tests/"
    }
  }
}

最後に

今までのテストはクラスを対象にしていたため、このようなことは起こらなかった。
今後はしっかりと理解したうえでしてツールを使うことをより意識していきたい。

参照

PSR-4: Autoloader

GitHubで編集を提案

Discussion