LoginSignup
sayuprc
@sayuprc (白湯)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PHPUnit 関数のテストができない。

Q&AClosed

解決したいこと

PHPUnitを用いて自作関数のテストを行いたいです。

発生している問題・エラー

./vendor/bin/phpunit を実行すると、関数が定義されていないというエラーが出てきます。

$ ./vendor/bin/phpunit
PHPUnit 9.5.21 #StandWithUkraine

E                                                                   1 / 1 (100%)

Time: 00:00.005, Memory: 6.00 MB

There was 1 error:

1) Tests\FlatTest::testFlat
Error: Call to undefined function Functions\flat()

/var/www/html/tests/FlatTest.php:16

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

該当するソースコード

src/Flat.php
<?php

declare(strict_types=1);

namespace Functions;

function flat(array $array, int $depth = 0)
{
    // 内容は省略
}
tests/FlatTest.php
<?php

declare(strict_types=1);

namespace Tests;

use function Functions\flat;
use PHPUnit\Framework\TestCase;

class FlatTest extends TestCase
{
    public function testFlat(): void
    {
        $input = [1, 2, 3, 4, 5];
        $expected = [1, 2, 3, 4, 5];
        $actual = flat($input);

        $this->assertSame($expected, $actual);
    }
}

バージョン

PHP 8.1
PHPUnit 9.5.21

0

2Answer

PHPUnitを実行するにあたり、テスト対象のファイルは読み込まれていますか?

テスト対象を読み込むにはbootstrap属性が使えます。

この属性は、テストが実行される前に読み込まれるブートストラップスクリプトを設定します。このスクリプトは通常、テスト対象のコードをロードするために使用される オートローダーコールバックを登録するだけです。

1

Comments

  1. @sayuprc

    Questioner
    回答ありがとうございます。

    コマンド実行時のオプション追加、phpunit.xmlへのbootstrapの記載を行ったところ、正常にテストすることができました。


    ですが、ここで一つ疑問点が出てきました。
    他のプロジェクトのphpunit.xmlを見てみると、bootstrapの記述がありませんでした。
    bootstrapの記述がないにもかかわらず、テストは正常に行うことができました。
    他プロジェクトでのテスト実行時のコマンドは `./vendor/bin/phpunit` です。
    また、PHPUnitのバージョンは、9.5.21です。
    この違いが何なのかがわかりません。
    もしご存じであれば、ご教授いただければ幸いです。


    他プロジェクトのphpunit.xml


    ```phpunit.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <phpunit colors="true">
    <testsuites>
    <testsuite name="Test suite">
    <directory>tests</directory>
    </testsuite>
    </testsuites>
    </phpunit>

    ```

composer.jsonのautoload > filesに対象のファイルパスを記述することで正常に動作しました。

今回のテスト対象のファイルが、クラスファイルではなかったため、PSR-4の項目に設定が書いてあっても、ロードされていないのが原因でした。

composer.json
{
  "autoload": {
    "files": ["src/flat.php"] // これを追記
  }
}
0

Your answer might help someone💌