2

Exception抽象メソッドを持たないカスタム名前空間に抽象クラスがあります。すべてのメソッドは、そのテストでカバーされているものとして示されています (標準的な方法でモックされています)。抽象化する理由は重要ではありません。

Exception次に、拡張するがメソッド、プロパティ、定数などを追加またはオーバーライドしない約10のクラスがあります。それらすべてもカバーする必要があることは明らかですが、完全にはカバーされていないように示されています。私はドキュメントを読み、しばらくグーグルで検索しましたが、答えが見つかりませんでした。

  • PHP_CodeCoverage 1.1.3
  • PHPユニット 3.6.12
  • PHP 5.4.4
  • Xdebug 2.2.1-5.4-vc9

で注釈を付けること@codeCoverageIgnoreは解決策ですが、100% のカバレッジを得るのではなく、なぜこのように起こるのかを知りたいのです。

UPD: ソース。

------------- 抽象クラス ----------

namespace Jade\Core\Base;


abstract class Exception extends \Exception {
    /**
     * Additional info for exception
     * @var array|null
     */
    protected $info;

    public function __construct($message, array $info = null, $code = 0, \Exception $previous = null) {
        parent::__construct($message, $code, $previous);
        $this->info = $info;
    }

    /**
     * Get the Exception additional info
     * @return mixed
     */
    public function getInfo() {
        return $this->info;
    }
}

------------- 抽象クラスのテスト ----------

class ExceptionTest extends \PHPUnit_Framework_TestCase {
    /**
     * @covers \Jade\Core\Base\Exception
     *
     * @group  public
     */
    public function testGetInfo() {
        $info = array('info' => 'test');
        $stub = $this->getMockForAbstractClass('\Jade\Core\Base\Exception', array('message', $info));

        $this->assertEquals($info, $stub->getInfo());
    }

    /**
     * @covers \Jade\Core\Base\Exception
     *
     * @group  public
     */
    public function testConstructWithDefaultInfo() {
        $stub = $this->getMockForAbstractClass('\Jade\Core\Base\Exception', array('message'));
        $this->assertEmpty($stub->getInfo());
    }
}

------------- 抽象クラスを拡張したクラス ----------

namespace Jade\Core\Exceptions;


class Dict extends \Jade\Core\Base\Exception {
}

コード カバレッジ ツールの出力

アップデート

\Exception との衝突の可能性を避けるために名前を変更\Jade\Core\Base\Exceptionしても役に立ちませんでした (試してみ\Jade\Core\Base\Ixceptionました)。

例外クラスを抽象ではなく通常のクラスにすることも役に立ちませんでした。

4

2 に答える 2

1

クラス宣言はXdebugによって実行可能コードとして表示されます。カバーされていることを示すには、そのクラス (上記の「\Jade\Core\Exceptions\Dict」) を使用する必要があります。このクラスはインスタンス化されるように設計されているため、このクラスを使用して少なくとも 1 つのオブジェクトを作成する必要があります。

投稿されたように、テストはインスタンス化されていないDictためDict、実際にはカバーされていません。Dictの代わりに使用するモック オブジェクトの作成を変更する必要があります\Jade\Core\Base\Exception

$stub = $this->getMockForAbstractClass('\Jade\Core\Exceptions\Dict', ...);

ノート

PHPUnit と PHP_CodeCoverage は、Xdebug によって提供されたデータを解釈するだけです。Xdebug によって提供されるデータを解釈するだけです。いくつかのまれなケースでは、非実行可能コードが右中括弧ifelseブロックを含む実行可能コードとして扱われ、クラス宣言はインスタンス化しても実行済みとしてカウントされず、ファイルの内容の前後にある既存の行が実行されます。実際の問題を実証するための最小限のテスト ケースを作成できる場合は、それをXdebug の問題トラッカーに投稿してください。

于 2012-08-18T08:35:37.820 に答える
1

問題は完全にクラスのオートロードにありました。仕事を得るには、ブートストラップファイルにクラスソースを含むファイルを手動で含める必要がありました。

于 2012-08-22T16:39:47.050 に答える