web-dev-qa-db-ja.com

PHP PHPUnitの警告を無視する

PHPUnitを使用して関数のユニットテストを行っていますが、コードで警告が発生した場合、その関数に対してテストスクリプトは実行されません。警告を無視してテストを続行する方法を誰かに教えてもらえますか

22
somu.web

Juhanaがコメントしたように、最初に警告が表示されるコードを修正する必要があります。これは、コードが適切に/厳密に機能していないことを示しています。

デフォルトでは、PHPUnitはテストの実行中にトリガーされるPHPエラー、警告、および通知を例外に変換します。

警告をテストする方法(およびテストで呼び出すサブルーチンで警告を無視する方法)の詳細については、 Testing PHP Errors を参照してください)。

デフォルトの動作を無効にするには、テストでPHPUnitに無効にするように指示できます。テストのsetUp内、またはグローバルネームスペースで静的変数を設定してテスト自体:

# Warning:
PHPUnit_Framework_Error_Warning::$enabled = FALSE;

# notice, strict:
PHPUnit_Framework_Error_Notice::$enabled = FALSE;

デフォルトの動作を変更する別のオプションは、次の設定で XMLファイルでテストランナーを構成する です。

<phpunit convertErrorsToExceptions="false"
         convertNoticesToExceptions="false"
         convertWarningsToExceptions="false">
</phpunit>

これらの3つのオプションは、コマンドラインスイッチとしては使用できません。

関連する質問も参照してください: PHPUnitでエラーをトリガーするメソッドの戻り値をテスト

35
hakre

テストごとのレベルでこれを行うための文書化された戦略は、@テストが警告または通知をトリガーする関数を呼び出すときのエラー抑制演算子。

次のコードは PHPUnitドキュメント の例です。

<?php
class ErrorSuppressionTest extends PHPUnit_Framework_TestCase
{
    public function testFileWriting() {
        $writer = new FileWriter;
        $this->assertFalse(@$writer->write('/is-not-writeable/file', 'stuff'));
    }
}
class FileWriter
{
    public function write($file, $content) {
        $file = fopen($file, 'w');
        if($file == false) {
            return false;
        }
        // ...
    }
}
3
Courtney Miles

警告は無視しないでください。理由はあります。そうは言っても、警告や通知は致命的であるようには意図されていません(致命的であるように意図されていた場合はエラーになります)。

警告を無視する代わりに、単体テストで警告をテストする必要があります。 Netsilik/BaseTestCase (MIT License)を使用してこれを行うことができます。このPHPUnitの拡張機能を使用すると、トリガーされたエラー/警告を例外に変換せずに直接テストできます。

composer require netsilik/base-test-case


E_USER_NOTICEのテスト:

<?php
namespace Tests;

class MyTestCase extends \Netsilik\Testing\BaseTestCase
{
    /**
     * {@inheritDoc}
     */
    public function __construct($name = null, array $data = [], $dataName = '')
    {
        parent::__construct($name, $data, $dataName);

        $this->_convertNoticesToExceptions  = false;
        $this->_convertWarningsToExceptions = false;
        $this->_convertErrorsToExceptions   = true;
    }

    public function test_whenNoticeTriggered_weCanTestForIt()
    {
        $foo = new Foo();
        $foo->bar();

        self::assertErrorTriggered(E_USER_NOTICE, 'The warning string');
    }
}

これが将来の誰かを助けることを願っています。

0
Jacco