Pregunta

Estoy usando el elemento de hash oculto CSRF con Zend_Form y tratando de probar la unidad del inicio de sesión, pero no saben cómo escribir un ensayo Unidad para incluir ese elemento. Mirado en la documentación y leer tantos tutoriales que pude encontrar. Incluso href="http://delicious.com/joedevon/zf+phpunit" ellos delicioused todo , pero nadie menciona esto.

¿Fue útil?

Solución

El hash correcto esté almacenado en la sesión, y el elemento de forma Hash tiene una instancia de Zend_Session_Namespace que contiene el espacio de nombres para el hash.

Para probar la unidad de elemento, debería reemplazar la instancia Zend_Session_Namespace en el elemento (con setSession) con uno se crea a sí mismo que contiene el hash correcto (el hash se almacena en la tecla "control")

Para más ejemplos que probablemente se podría mirar las pruebas unitarias de Zend Framework para la clase Zend_Form_Element_Hash. Yo asumiría que han tenido que hacer frente a esto también.

Otros consejos

se genera valor csrf cada formulario momento de prestar. elemento oculto del formulario se llena previamente con ese valor. Este valor también se almacena en la sesión. Después de la presentación del modelo, comprobaciones de validación si el valor publicado de la forma se almacena en la sesión, si falla la validación no entonces. Es esencial, que la forma debe hacerse durante la prueba (por lo que puede generar el valor oculto y almacenarla a la sesión), entonces podemos extraer lo que es el valor oculto de HTML representado, y luego podemos añadir valor hash oculto en Nuestra solicitud. Considere este ejemplo:

function testAddPageStoreValidData()
{
    // render the page with form 
    $this->dispatch('/form-page');

    // fetch content of the page 
    $html = $this->getResponse()->getBody();

    // parse page content, find the hash value prefilled to the hidden element
    $dom = new Zend_Dom_Query($html);
    $csrf = $dom->query('#csrf')->current()->getAttribute('value');

    // reset tester for one more request
    $this->resetRequest()
         ->resetResponse();

    // now include $csrf value parsed from form, to the next request
    $this->request->setMethod('POST')
                  ->setPost(array('title'=>'MyNewTitle',
                                  'body'=>'Body',
                                  'csrf'=>$csrf));
    $this->dispatch('/form-page');

    // ...
}

Me puse una variable de entorno en mi archivo de host virtual Apache, que le dice al servidor de código que se está ejecutando en: desarrollo, puesta en escena, o la producción

La línea para el archivo de host virtual es:

SetEnv SITE_ENV "dev" 

A continuación, acabo de hacer mis formas reaccionan al entorno apropiado:

if($_SERVER['SITE_ENV']!='dev')
{
   $form_element->addValidator($csrf_validator);
}

Yo uso la misma técnica para un montón de cosas. Por ejemplo, si se trata de dev, vuelvo a dirigir todo el correo electrónico saliente para mí, etc.

contesté una pregunta más reciente similar a éste. Estoy poniendo mi respuesta aquí también en el caso de que ayuda a nadie en el futuro.

Hace poco encontré una gran manera de las formas de prueba con elementos de patata. Esto utilizará un objeto de burla de código auxiliar de distancia del elemento hash y usted no tendrá que preocuparse por ello. Ni siquiera tendrá que hacer un session_start o algo así. Usted no tendrá que 'prerender' la forma tampoco.

En primer lugar crear una clase 'trozo' como tal

class My_Form_Element_HashStub extends Zend_Form_Element_Hash
{
    public function __construct(){}
}

A continuación, añada lo siguiente a la forma en alguna parte.

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
    }
}

El método set está allí sólo para propósitos de prueba realmente. Es probable que no va a usar en absoluto durante el uso real, pero ahora en PHPUnit Puede hacer lo siguiente.

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 ) );
    }
}

Se tiene que crear su propio trozo. No se puede simplemente llamar al método PHPUnit getMockObject() debido a que se extenderá directamente el elemento hash y el elemento hash de lo normal hace cosas 'mal' en su constructor.

Con este método usted ni siquiera necesita estar conectado a una base de datos para probar sus formas! Me tomó un tiempo para pensar en esto.

Si lo desea, puede empujar el método setHashElement() (junto con la variable y el método get) en alguna clase base FormAbstract.

Recuerde, en PHPUnit usted tiene que pasar el elemento hash de forma durante la construcción. Si no lo hace, su método init() se llamará antes de que su talón de hash se puede establecer con el método set y se le terminan usando el elemento hash de regular. Usted sabrá que está usando el elemento hash de regular debido probablemente obtendrá un error de la sesión si no está conectado a una base de datos.

Quiero saber si usted ha resultado útil o si lo usa.

Solución para ZF2 es la creación de su formulario en la prueba, y obtener el valor de su elemento de formulario csrf:

        $form = new  \User\Form\SignupForm('create-user');
        $data = [
            'security' => $form->get('security')->getValue(),
            'email' => 'test@test.com',
            'password' => '123456',
            'repeat-password' => '123456',
        ];
        $this->dispatch('/signup', 'POST', $data);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top