Недавно я нашел отличный способ тестирования форм с элементами хеша.Это будет использовать фиктивный объект, чтобы заглушить хеш-элемент, и вам не придется беспокоиться об этом.Вам даже не нужно будет делать session_start или что-то подобное.Вам также не нужно «предварительно» представлять форму.
Сначала создайте класс-заглушку, например, так:
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 вы можете исправить следующее:
</p>
<pre>
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 ) );
}
</pre>
<p>
У вас ДОЛЖЕН быть свой собственный заглушку.Вы не можете просто вызвать метод phpunit getMockObject
, потому что это непосредственно расширит элемент хеша, а обычный элемент хеша делает «злые» вещи в своем конструкторе.
С этим методом вам даже не нужно подключаться к базе данных для проверки ваших форм!Мне понадобилось время, чтобы подумать об этом.
Если вы хотите, вы можете вставить метод setHashElement
(вместе с переменной и методом get) в некоторый базовый класс FormAbstract.
REMEMBER, в phpunit вы ДОЛЖНЫ передать хешэлемент при создании формы.Если вы этого не сделаете, ваш метод init будет вызван до того, как ваш хэш заглушки может быть установлен с помощью метода set, и вы в конечном итоге будете использовать обычный элемент хеша.Вы будете знать, что используете обычный элемент хеширования, потому что, возможно, у вас возникнет ошибка сеанса, если вы НЕ подключены к базе данных.
Дайте мне знать, если вы найдете это полезным или используете его.