Я ответил на более свежий вопрос, похожий на этот. Я также привожу здесь свой ответ на случай, если он кому-нибудь поможет в будущем.
Недавно я нашел отличный способ тестирования форм с элементами хеша. Это будет использовать фиктивный объект, чтобы заглушить хеш-элемент, и вам не придется беспокоиться об этом. Вам даже не нужно будет делать session_start или что-то подобное. Вам также не придется «предварительно» представлять форму.
Сначала создайте класс 'stub', например, так:
class My_Form_Element_HashStub extends Zend_Form_Element_Hash
{
public function __construct(){}
}
Затем добавьте в форму следующее:
class MyForm extends Zend_Form
{
protected $_hashElement;
public function setHashElement( Zend_Form_Hash_Element $hash )
{
$this->_hashElement = $hash;
return $this;
}
protected function _getHashElement( $name = 'hashElement' )
{
if( !isset( $this->_hashElement )
{
if( isset( $name ) )
{
$element = new Zend_Form_Element_Hash( $name,
array( 'id' => $name ) );
}
else
{
$element = new Zend_Form_Element_Hash( 'hashElement',
array( 'id' => 'hashElement' ) );
}
$this->setHashElement( $element );
return $this->_hashElement;
}
}
/**
* In your init method you can now add the hash element like below
*/
public function init()
{
//other code
$this->addElement( $this->_getHashElement( 'myotherhashelementname' );
//other code
}
}
Метод set существует только для тестирования. Возможно, вы не будете использовать его вообще во время реального использования, но теперь в phpunit вы можете исправить следующее.
class My_Form_LoginTest extends PHPUnit_Framework_TestCase
{
/**
*
* @var My_Form_Login
*/
protected $_form;
/**
*
* @var PHPUnit_Framework_MockObject_MockObject
*/
protected $_hash;
public function setUp()
{
parent::setUp();
$this->_hash = $this->getMock( 'My_Form_Element_HashStub' );
$this->_form = new My_Form_Login( array(
'action' => '/',
'hashElement' => $this->_hash
}
public function testTrue()
{
//The hash element will now always validate to true
$this->_hash
->expects( $this->any() )
->method( 'isValid' )
->will( $this->returnValue( true ) );
//OR if you need it to validate to false
$this->_hash
->expects( $this->any() )
->method( 'isValid' )
->will( $this->returnValue( true ) );
}
}
Вы ДОЛЖНЫ создать свою собственную заглушку. Вы не можете просто вызвать метод phpunit getMockObject()
, потому что это непосредственно расширит элемент хеша, а обычный элемент хеша делает «злые» вещи в своем конструкторе.
С этим методом вам даже не нужно подключаться к базе данных для проверки ваших форм! Мне понадобилось время, чтобы подумать об этом.
Если хотите, вы можете вставить метод setHashElement()
(вместе с переменной и методом get) в некоторый базовый класс FormAbstract.
ПОМНИТЕ, в phpunit вы ДОЛЖНЫ передавать элемент hash во время построения формы. Если вы этого не сделаете, ваш метод init()
будет вызван до того, как ваш хэш заглушки может быть установлен с помощью метода set, и вы в конечном итоге будете использовать обычный элемент хеша. Вы будете знать, что используете обычный хеш-элемент, потому что, возможно, у вас возникнет ошибка сеанса, если вы НЕ подключены к базе данных.
Дайте мне знать, если вы найдете это полезным или если вы его используете.