私は、ソケット接続を開いて、使用し、それを閉じたメソッドを持っていました。それをテスト可能にするために、私はコネクションの処理を別々のメソッドに移しました(以下のコードを参照)。PHPで単位テストのためのリソースを偽造するには?
今度はbarIntrefaceMethod()
のユニットテストを書いて、メソッドopenConnection()
をモックする必要があります。言い換えれば、私は偽物resource
が必要です。
「」などのハンドルを偽造するために、PHPでタイプresource
の変数を手動で作成する方法はありますか?
FooClass
class FooClass
{
public function barIntrefaceMethod()
{
$connection = $this->openConnection();
fwrite($connection, 'some data');
$response = '';
while (!feof($connection)) {
$response .= fgets($connection, 128);
}
return $response;
$this->closeConnection($connection);
}
protected function openConnection()
{
$errno = 0;
$errstr = null;
$connection = fsockopen($this->host, $this->port, $errno, $errstr);
if (!$connection) {
// TODO Use a specific exception!
throw new Exception('Connection failed!' . ' ' . $errno . ' ' . $errstr);
}
return $connection;
}
protected function closeConnection(resource $handle)
{
return fclose($handle);
}
}
私はこのことについて正しいことをしているかどうかはわかりません。私が正しく理解していれば、 '$ resource-> openConnection()'から返された擬似/偽のリソースオブジェクトに対して、PHPの組み込みメソッド(fwrite、feofなど)を効果的にテストしたいことがあります。代わりに、それらのメソッドの周りにラッパーオブジェクトを持つことを考えて、 'fwrite($ resource、 'something')'の代わりに '$ resource-> write( 'something')'をテストできるようにする必要があります。 –
コメントありがとうございます!いいえ、確かに、私はネイティブ関数をテストするつもりはありません。そして、はい、接続設定関連のPHP関数をラップするメソッドを作成しました。しかし今、私は、これらのラッピング関数を呼び出す 'barIntrefaceMethod()'のテストのためにその結果を模擬したいと思っています。問題は、私が['resource'](http://php.net/manual/en/language.types.resource.php)を偽造する方法を見つけることができないことだけです。それは 'openConnection()'の嘲笑を挫折させます。 – automatix
ネイティブ関数をテストすることはできませんが、コード内で呼び出す必要があり、実際のリソースハンドルに依存していることは知っています。これを行う最も簡単で優れた設計方法は、ネイティブ関数をラップしたオブジェクトを作成し、その代わりに* *を模倣することです。私はコードでより良い意味を説明する答えを投稿します。 –