Domanda

Sto scrivendo dei test per il mio progetto attuale, realizzato con Zend Framework. Va tutto bene, ma ho un problema nel testare le azioni / i controller degli utenti registrati: devo essere loggato per poter eseguire l'azione / controller.

Come posso accedere a PHPUnit?

È stato utile?

Soluzione

Come stai dicendo che vuoi testare azioni / controller, suppongo che tu non stia scrivendo unit test, ma test funzionali / di integrazione - cioè, lavorando con Zend_Test e test tramite MVC.

Ecco una funzione di test che ho usato in un progetto, dove sto testando se il login è OK:

public function testLoggingInShouldBeOk()
{
    $this->dispatch('/login/login');
    $csrf = $this->_getLoginFormCSRF();
    $this->resetResponse();
    $this->request->setPost(array(
        'login' => 'LOGIN',
        'password' => 'PASSWORD',
        'csrfLogin' => $csrf,
        'ok' => 'Login',
    ));
    $this->request->setMethod('POST');
    $this->dispatch('/login/login');
    $this->assertRedirectTo('/');
    $this->assertTrue(Zend_Auth::getInstance()->hasIdentity());
}

Semplicemente: sto caricando il modulo di accesso, estraendo il token CSRF, popolando il modulo e pubblicandolo.

Quindi, posso verificare se sono connesso.


Con ciò, probabilmente puoi estrarre la parte di accesso, per chiamarla prima di ognuno dei tuoi test che richiedono l'accesso di un utente valido.

Altri suggerimenti

C'è un altro modo. Nella mia entità User ho un metodo login () che inserisce l'id utente nella sessione e una variabile statica. Quello che faccio solo nel test setUp () è call $ user- > login () e funziona. Nel test dell'ambiente non vengono utilizzate sessioni (l'impostazione Zend_Session :: $ isUnitTested = true ha questo effetto) e i test si basano sulla variabile statica. Ricorda solo di cancellare la variabile statica ( logout () l'utente) su tearDown () .

Penso che questo articolo possa aiutarti: http://perevodik.net/en/posts/7/ Descrive come creare un'identità falsa che è possibile utilizzare per impostare l'ambiente su uno stato equivalente a un utente che ha effettuato l'accesso.

Più o meno allo stesso modo in cui Pascal sta usando questa funzione:

$this->_getLoginFormCSRF();

Ho creato una funzione generica che restituisce il valore caricando il modulo utilizzando il gestore dell'elemento del modulo:

  

funzione pubblica _getCSRFHashValueFromForm ($ formAlias, $ csrfName) {       $ form = $ this- > servicemanager- > get ('FormElementManager') - > get ($ formAlias);       return $ form- > get ($ csrfName) - > getValue (); }

Questo ovviamente presuppone che il CSRF sia legato al modulo e non all'interno di alcun fieldset ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top