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