SimpleTestでprotected methodのテスト

protectedなメソッドのテストがしたい場合はどうしたらいいのかなと思い、
CakePHPを覗いてみたところ、cake/tests/cases/libs/http_socket.test.phpでテストしてたのでメモ。



http_socketのテストのsetUp()でMockHttpSocketクラスやMockHttpSocketRequestsをnewしてる。

$this->Socket =& new MockHttpSocket();
$this->RequestSocket =& new MockHttpSocketRequests();

で、MockHttpSocket〜はその前のMock::generatePartialで作られたクラス。

if (!class_exists('MockHttpSocket')) {
	Mock::generatePartial('TestHttpSocket', 'MockHttpSocket', array('read', 'write', 'connect'));
	Mock::generatePartial('TestHttpSocket', 'MockHttpSocketRequests', array('read', 'write', 'connect', 'request'));
}

Mock::generatePartialはSimpleTestに付属してるもので、

Mock::generatePartial(元になるクラス, 作りたいクラス, 追加したいメソッド配列)

という構文らしい。
追加したいメソッドがなければarray()とすればいい。



元になるクラスのTestHttpSocketがその前に定義されていて、

class TestHttpSocket extends HttpSocket {

のように、protectedメソッドを持つテストしたいクラスを継承している。



あとはそのクラスの中でprotectedメソッドを呼び出すpublicメソッドを作ればよさそう。

function configUri($uri = null) {
	return parent::_configUri($uri);
}