名前空間+ 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を使用するオプションは唯一のオプションではなく、ここでは簡単にするために示しています。 私が提案するのは既成のソリューションではなく、誰もが自分のニーズに適応できるアプローチのみです。

Source: https://habr.com/ru/post/J124933/


All Articles