2015-10-12 18 views
10

Sto scrivendo i test per la mia applicazione Laravel utilizzando la libreria Codeception. Sto usando il Laravel5 module e lo ho configurato con cleanup il che significa che tutti i test verranno eseguiti all'interno di una transazione di database, in modo che il mio database di test non si riempia di dati di test.Test di una rotta di Laravel 5 con una regola esistente tramite Codeception

Uno dei punti finali sto testando ha le seguenti regole di validazione insieme contro tramite Richieste Forma:

public function rules() 
{ 
    return ['user_id' => 'required|exists:users,id']; 
} 

Il test che ho scritto Per postare messaggi in questo endpoint è la seguente:

public function store(ApiTester $I) 
{ 
    // Create a couple of users 
    $users = factory(\App\Models\User::class, 2)->create(); 

    $I->wantTo('ask someone to be my friend'); 
    $I->authenticateAs($users[0]); 
    $I->sendPOST('users/' . $users[0]->id . '/friendships', [ 
     'user_id' => $users[1]->id 
    ]); 
    $I->seeResponseCodeIs(201); 
} 

Questo test fallisce sempre. Dopo aver esaminato, posso vedere che non riesce perché la richiesta non riesce a convalidare a causa della regola exists:users,id. Se cambio le impostazioni di Codeception per non eseguire test all'interno di una transazione, il validatore di Laravel può vedere con successo l'esistenza dei due utenti che ho creato all'inizio del mio test e il test passa.

Quindi, la mia domanda è: esiste un modo per mantenere il comportamento del wrapping di ciascuno dei miei test in una transazione di database e far sì che il validatore di Laravel possa vedere i record che creo nei miei test?

+0

Io ho lo stesso identico problema che ogni aiuto sarebbe gradito – Fabrizio

+0

Potresti aggiungere una configurazione di suite alla tua domanda? – Naktibalda

risposta

4

Il problema è che, se la transazione non viene eseguita, i dati originali nelle tabelle del database non sono interessati. Quindi, all'interno della transazione, si creano due utenti, ma non esiste alcuna istruzione di commit che possa persistere nel database. Quindi la regola di validazione laravel 'exists' non può trovarli (quella regola fa una richiesta al database per trovare user_id particolari).

Quindi nel tuo caso gli utenti devono esistere prima del test. Consiglierei di usare invece le Migrazioni. Resetting Database after each test

Crea le tue tabelle con migrazioni di database e sementi e arrotolale dopo che i test sono terminati.

+0

Speravo di poter evitare la migrazione del mio database prima di ogni test. Sembra che avrebbe una penalità ad alte prestazioni rispetto all'esecuzione all'interno di una transazione. Quello che non capisco è come il validatore di Laravel non possa vedere gli utenti che ho creato, che siano Laravel e Codeception che usano due diverse connessioni di database? –

0

Citazione:

$I->sendPOST('users/' . $users[0]->id . '/friendships', [ 
    'user_id' => $users[1]->id 
]); 

Perché si sta inviando $users[0]->id nella richiesta URL e poi 'user_id' => $users[1]->id nei parametri?

Questo potrebbe essere il tuo problema? Questo potrebbe essere il motivo per cui non stai accettando la validazione?

+0

Questo non è il problema. Questo endpoint accetta l'ID utente di * un altro * utente con cui chiedi di essere amico. –