Проблема в дизайне класса SimpleMock:
protected function addCall($method, $args) {
if (! isset($this->call_counts[$method])) {
$this->call_counts[$method] = 0;
}
$this->call_counts[$method]++;
}
Они должны были создать класс регистратора для регистрации свойств вызова вместо установки свойства в SimpleMock ... Мы можем создать обходной путь, расширяякласс SimpleMock:
class LoggedMock extends SimpleMock {
protected $invokes = array();
public function &invoke($method, $args) {
$this->invokes[] = array($method, $args);
return parent::invoke($method, $args);
}
public function getMockInvokes() {
return $this->invokes;
}
}
и установить его в качестве базового класса mock:
require_once __DIR__.'simpletest/autorun.php';
SimpleTest::setMockBaseClass('LoggedMock');
После этого мы можем получить список вызовов с помощью $ mockObj-> getMockInvokes ().
Редактировать : мы не можем расширить addCall, потому что в первой строке метода invoke имя метода преобразуется в lowerCase, поэтому, расширяя addCall, мы можем только регистрироватьформат lowerCase, а не camelCase.(Я думаю, что преобразование строчных букв является ошибкой ...)
Я создал тест для демонстрации:
interface Nike {
public function justDoIt();
}
class NikeUser {
protected $nike;
public function setNike(Nike $nike) {
$this->nike = $nike;
}
public function doIt() {
$this->nike->justDoIt();
}
}
Mock::generate('Nike', 'MockNike');
class NikeUserTest extends UnitTestCase {
public function testDoItButWeDontWantJustDoIt() {
$mockNike = new MockNike();
$nikeUser = new NikeUser();
$nikeUser->setNike($mockNike);
$expectedInvokes = array();
$nikeUser->doIt();
$expectedInvokes[] = array('justDoIt', array());
$this->assertEqual($expectedInvokes, $mockNike->getMockInvokes());
}
}