J'essaie de configurer les tests unitaires dans Laravel 5.1. En suivant la documentation = Je vois ceci:
Laravel est construit avec des tests à l'esprit. En fait, la prise en charge des tests avec PHPUnit est incluse prête à l'emploi
et
Lors de l'exécution des tests, Laravel définira automatiquement l'environnement de configuration sur testing. Laravel configure automatiquement la session et le cache sur le pilote de la baie pendant le test, ce qui signifie aucune session ou les données du cache seront conservées lors des tests.
ce qui est génial. Mais ... comment dire à Laravel d'utiliser la connexion à la base de données SQLite lorsque les tests sont exécutés?
La seule chose qu'il y a dans config/database.php est ce code commenté:
/* We might use this connection for unit tests
'sqlite' => [
'driver' => 'sqlite',
'database' => storage_path().'/database.sqlite',
'prefix' => '',
],
*/
Nous pourrions utiliser cela :)
Existe-t-il un moyen de définir cela globalement pour tous les tests? Dois-je configurer la connexion dans chaque cas de test?
Toute aide appréciée.
En fait, c'est assez simple.
Créez une base de données de test sur votre storage/
dossier, avec le nom database.sqlite
ou si vous voulez un autre nom ou un autre emplacement, vous devez changer les configurations sur le config/database.php
fichier, ce sont les configurations par défaut:
'sqlite' => [
'driver' => 'sqlite',
'database' => storage_path('database.sqlite'),
'prefix' => '',
],
Vous avez deux options, soit vous modifiez votre .env
ou vous spécifiez simplement le nom de la base de données où vous souhaitez exécuter vos migrations:
php artisan migrate --database=sqlite
Si vous préférez modifier votre .env
fichier, alors nous devons ajouter une nouvelle variable:
DB_CONNECTION=sqlite
En effet, Laravel utilise par défaut MySQL lorsque cette variable est absente de .env
fichier:
//config/database.php file
'default' => env('DB_CONNECTION', 'mysql'),
Maintenant que notre application pointe vers notre base de données sqlite, nous pouvons maintenant exécuter nos migrations et amorçage. Après cela, si vous souhaitez continuer à exécuter MySQL, supprimez DB_CONNECTION=sqlite
du .env
fichier.
Maintenant que vous avez vos migrations sur votre base de données de test, la dernière étape consiste simplement à spécifier, votre SQLite comme base de données par défaut pour les tests.
Sur votre dossier racine, vous avez un phpunit.xml
fichier, ouvrez-le et une nouvelle variable sous <php>
noeud:
<env name="DB_CONNECTION" value="sqlite"/>
Maintenant, votre application utilise MySQL et phpunit utilise SQLite.
Rappelez-vous que si vous modifiez le .env
pour le rétablir dans votre base de données par défaut;
Soyez prudent lorsque vous exécutez vos migrations, si vous avez spécifié une connexion sur la migration elle-même, il essaiera de l'exécuter sur cette connexion.
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AdminUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::connection('manage')->create('admin_users', function (Blueprint $t) {
$t->increments('id');
$t->string('name');
$t->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::connection('manage')->dropIfExists('admin_users');
}
}
Cette migration s'exécutera toujours sur la connexion gérer peu importe ce que vous spécifiez sur le .env
fichier ou dans la commande de migration
J'ai un peu une solution différente. J'utilise une base de données sqlite en mémoire.
je change d'abord la valeur par défaut, puis j'ajoute une nouvelle connexion au database.php dans config
'default' => env('DB_CONNECTION', 'mysql'),
...
'testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
puis j'ajoute la ligne suivante au phpunit.xml
<env name="DB_CONNECTION" value="testing"/>
Je laisse le fichier .env intact. De cette façon, la connexion à la base de données sera par défaut "mysql"
Voici le phpunit.xml complet pour plus de clarté
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false">
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">app/</directory>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="./report/" charset="UTF-8"
yui="true" highlight="false"
lowUpperBound="50" highLowerBound="80"/>
</logging>
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_CONNECTION" value="testing"/>
</php>
</phpunit>