🐙
PHPUnitで自作関数をテストするときに詰まった話
詰まったこと
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/"
}
}
}
最後に
今までのテストはクラスを対象にしていたため、このようなことは起こらなかった。
今後はしっかりと理解したうえでしてツールを使うことをより意識していきたい。
Discussion