web-dev-qa-db-fra.com

Définissez SQLite comme base de données pour les tests unitaires dans Laravel 5.1

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.

23
lesssugar

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;

PS

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

34
Fabio Antunes

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>
8
cw24