2015-07-06 11 views
12

Sto scrivendo alcuni test unitari per testare gli endpoint API nella mia applicazione Laravel 5 e molti endpoint richiedono l'autenticazione dell'utente. Invece di avere lo stesso codice di creazione dell'account utente in ogni test, ho voluto definire un tratto RegistersUsers da utilizzare nelle classi di test, che avrà un metodo registerUser().Trait non trovato all'interno dei test dell'unità Laravel 5

La struttura di directory della mia cartella tests è in questo modo:

/tests 
    /Traits 
     RegistersUsers.php 
    TestCase.php 
    UserTest.php 

ho namespace TestCase.php e UserTest.php con l'aggiunta di questa dichiarazione dello spazio dei nomi:

namespace MyappTests; 

e ho namespace RegistersUsers.php in questo modo :

namespace MyappTests\Traits; 

Il mio UserTest si presenta così, con lo spazio dei nomi e la dichiarazione use in modo da poter sfruttare RegistersUsers.

<?php 

namespace MyappTests; 

use MyappTests\Traits\RegistersUsers; 

class UserTest extends TestCase 
{ 
    use RegistersUsers; 

    // ... rest of the class 

Tuttavia, quando si esegue il test, PHPUnit muore con l'errore fatale:

Trait 'MyappTests\Traits\RegistersUsers' not found in /home/vagrant/demo-app-net/tests/UserTest.php on line 9

Per quanto posso dire, il mio namespacing è corretto e la mia caratteristica dovrebbe essere trovato. Sono andato in giro con questo e non riesco a capirlo.

risposta

15

Immagino di avere il tratto nella cartella Tratti, il tratto non è più rappresentato nel caricatore automatico.

Per correggere questo, si dovrebbe aprire composer.json, trovare la sectionfor autoload-dev e modificarlo a qualcosa come il seguente ...

"autoload-dev": { 
    "classmap": [ 
     "tests/TestCase.php", 
     "tests/Traits/" 
    ] 
}, 

E questo dovrebbe aggiungere alcun tratto che avete in quella cartella per l'autloader.

Modifica

Alcune idee supplementari sono stati portati in su nei commenti. Se si manterrà la corretta struttura di cartelle/spazi dei nomi, sarebbe una buona idea usare l'autoloading di psr-4 piuttosto che mantenere la mappa di classe.

"autoload-dev": { 
    "psr-4": { 
     "MyappTests\\": "tests/" 
    } 
}, 

Inoltre, piuttosto che mettere la logica in un tratto di registrare un utente per l'utilizzo con i test, quando si estende TestCase, porta in un metodo di supporto per l'accesso da un determinato utente. Lo useresti in questo modo ...

$user = User::find($id); 
$this->be($user); 
+0

Questo era esattamente il problema, immaginavo che sarebbe stato automaticamente raccolto! Grazie! –

+1

Oppure usa psr4, che troverà il tuo spazio dei nomi Tratti. – OIS

+0

La modifica sopra riportata dovrebbe aiutare con l'errore, ma la soluzione migliore per IMO sarebbe quella di utilizzare Codeception per scrivere test invece di PHPUnit direttamente - contiene molti metodi di supporto per rendere davvero facile il test delle app di Laravel. Compreso, ad es. $ I-> amLoggedAs() metodo che autenticherà il tuo utente. Vedi http://codeception.com/docs/modules/Laravel5 per maggiori dettagli. –