名前空間+ PHPUnit = 100%のテストカバレッジ

ソケット、データベース、ファイルなど、外部環境で機能する関数を使用するコードをテストする方法を長年共有したいと考えていました。 今日、記事Runkit + PHPUnit = 100%test coverageを見て、今がその時だと判断しました。

Runkitを使用したソリューションは美しいですが、1つの問題があります。RunkitはPHPとともに配布されないため、個別にインストールする必要があります。 ある条件下で、PHP 5.3+の通常の配信で機能するアプローチを提案したい-プロジェクトは名前空間を使用する必要があります。



アイデア





アイデアは非常にシンプルで、PHPで名前を解決するルールに基づいています 。呼び出された関数は最初に現在のネームスペースで検索され、それから初めてPHP組み込み関数が呼び出されます。 たとえば、次のコードでは:



namespace A;

foo();









PHPは最初にA \ foo()を呼び出し、次にfoo()を呼び出します。 これは、プロジェクトの名前空間で「fsockopen」などの名前の関数を宣言すると、最初に呼び出されることを意味します。



申込み





このクラスがあるとします:



src / MyClass.php

<?php

namespace MyNS;



class MyClass

{

public function someMethod()

{

$fp = fsockopen( 'example.org' , 123);

}

}




* This source code was highlighted with Source Code Highlighter .








fsockopen関数をオーバーライドするには、テストで次のファイルを作成します。



tests / helpers.php

<?php

namespace MyNS;



function fsockopen($hostname, $port)

{

$GLOBALS[ 'fsockopen' ] = array($hostname, $port);

}



* This source code was highlighted with Source Code Highlighter .








これで、次のようなテストを作成できます。



テスト/ MyClass_Test.php

<?php

namespace MyNS\Tests;

use PHPUnit_Framework_TestCase;

use MyNS\MyClass;



require 'helpers.php' ;

require '../src/MyClass.php' ;



class MyClass_Test extends PHPUnit_Framework_TestCase

{

public function test_someMethod()

{

$test = new MyClass();

$test->someMethod();

$ this ->assertEquals(array( 'example.org' , 123), $GLOBALS[ 'fsockopen' ]);

}

}




* This source code was highlighted with Source Code Highlighter .








このテストでは、組み込みのfsockopenは呼び出されませんが、helpers.phpで宣言されます。



もちろん、$ GLOBALSを使用するオプションは唯一のオプションではなく、ここでは簡単にするために示しています。 私が提案するのは既成のソリューションではなく、誰もが自分のニーズに適応できるアプローチのみです。



All Articles