6

私はこのような構造を持っています:

class Foo
{
    public function doFoo($value = '')
    {
        if (function_exists('foo'))
        {
            return foo($value);
        }
        // if php version does not support foo()
        // ...
    }
}

関数 foo の存在がインストールされている PHP のバージョンに依存する場合、このコードを PHPUnit でテストして 100% のコード カバレッジを達成するにはどうすればよいですか (この例では、関数が存在すると仮定します。それ以外の場合、100% のコード カバレッジは不可能です)。実行時にPHP関数を無効/有効にする方法はありますか?

それを解決する方法はありますか?

編集:

私は解決策を見つけました: 高度な PHP デバッガー / PECL 拡張機能は、この目的のために関数 *rename_function* を提供します。

bool rename_function (文字列 $original_name , 文字列 $new_name )

グローバル関数テーブルで orig_name を new_name に名前変更します。組み込み関数を一時的にオーバーライドするのに役立ちます。

4

2 に答える 2

3

foo()テスト メソッドでのシミュレーションを定義できます。次のようにします。

<?php
/**
 * Your test method
 */
public function testSomething () {

    // if the function not exists, create a simulation
    if(!function_exists('foo')) {
        function foo() {
            return $aValue;
        }
    }

    // your test code ...
}

関数が別のメソッドまたは関数に定義されている可能性があるため、これは機能します。これらはメソッドで定義されていますが、グローバルに使用できます。

pecl 拡張を使用する必要はありません。さらに、テスト実行環境を汚染する可能性があり、少なくとも不要な要件が追加されます。

さらに、バージョン 3.6 以降の PHPUnit は、クラス、メソッド、またはコードの一部をカバレッジ分析から除外するために使用できるアノテーション、、をサポートしていることに注意してください。@codeCoverageIgnore@codeCoverageIgnoreStart@codeCoverageIgnoreEnd

于 2012-12-22T18:51:41.130 に答える
1

PHP 5.3以降では、任意のPHP関数の動作をオーバーライドできます。

これを見てください

namespace Test
{
    function function_exists($function)
    {
        return false;
    }

    var_dump(function_exists('var_dump')); // bool(false)
}

これは、PHPのフォールバックメカニズムが原因で可能になります。つまり、関数に遭遇すると、最初にその関数が現在の名前空間に存在するかどうかを確認します。そうでない場合は、グローバル名前空間にフォールバックします。

于 2012-12-22T19:22:50.660 に答える