私はソケットから読み取るコードに取り組んでいますが、特定の大きな入力を取得するとうまくいきません。修正する前に、このための単体テストを追加しましたが、モックできないためにスタックしました(および、、など、fread
使用している他のPHP組み込み関数)。fsockopen
feof
簡単に言えば、私の問題は、このコードが「致命的なエラー:fgets()を再宣言できません...」で失敗することです。
function fgets($fp){
return "xxx";
}
実際のコードで使用するソケットラッパークラスを作成してから、そのラッパークラスのモックオブジェクトを作成できることに気付きました。しかし、それは犬を振る尾であり、私はそれが物事の原則を超えて悪い考えである理由を考えることができます。(たとえば、コードをより複雑で効率的にし、まだテストされていないコードをリファクタリングする必要があります。)
fgets()
だから、私の質問は、単体テスト内で、組み込みの実装を自分のものに置き換えるにはどうすればよいですか?(または、ボックスの外側を考えたい場合、質問は次のように表現できます:呼び出しからの戻り値はいつですか?への呼び出しがfgets($socket)
返す文字列をどのように制御できますか?)$socket
fsockopen
傍白
正解で必要とされるapdのインストールは、大変な作業です。これは2004年に最後にリリースされ、そのままではphp5.3をサポートしていません。そのためのUbuntuパッケージはなく、pecl install apd
失敗しました。それで、これをインストールする手順は次のとおりです(これらはubuntu 10.04用です)(すべてrootとして実行されます):
pecl download apd
tar xzf apd-1.0.1.tgz
cd apd-1.0.1
phpize
./configure
# Do edits (see below)
make install
実行する必要のあるパッチについては、https://bugs.php.net/bug.php?id=58798を参照してください。NB。実際に変更する必要がある行は1つだけなので、次のように手動で行うことができます。テキストエディタでphp_apd.cを開き、967行に移動して、CG(extended_info) = 1
この行を次の行に置き換えます。
CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
最後に、php.iniエントリを追加してアクティブ化する必要があります。http://php.net/manual/en/apd.installation.phpを参照してください