2016-03-13 3 views
1

Я создаю проект, используя Laravel, и сегодня у меня есть проблема, я не могу найти, как решить «правильным» способом.Тесты Laravel терпят неудачу после простой миграции

У меня есть этот миграционный класс:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class AddCityAndCountryColumnToClient extends Migration { 
    public function up() { 
     Schema::table('clients', function (Blueprint $table) { 
      $table->string('city')->nullable()->default(null); 
      $table->string('country', 2)->nullable()->default(null); 
     }); 
    } 

    public function down() { 
     Schema::table('clients', function (Blueprint $table) { 
      $table->dropColumn('country'); 
      $table->dropColumn('city'); 
     }); 
    } 
} 

У меня есть куча тестов, основанных на модели для этой таблицы «клиентов», и они работают прекрасно, но после того, как я добавил эту миграцию, мои тесты не каждый время с самого начала.

Теперь, я обнаружил, что если я изменить этот класс миграции к этому:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class AddCityAndCountryColumnToClient extends Migration { 
    public function up() { 
     Schema::table('clients', function (Blueprint $table) { 
      $table->string('city')->nullable()->default(null); 
      $table->string('country', 2)->nullable()->default(null); 
     }); 
    } 

    public function down() { 
     Schema::table('clients', function (Blueprint $table) { 
      // $table->dropColumn('country'); 
      // $table->dropColumn('city'); 
     }); 
    } 
} 

Теперь все мои тесты работать прекрасно. Но меня беспокоит тот факт, что метод «down» теперь фактически ничего не делает, когда он должен делать обратное «вверх».

Моя тестовая база данных в оперативной памяти SQLite экземпляр для целей скорости:

'sqlite_testing' => [ 
    'driver' => 'sqlite', 
    'database' => ':memory:', 
    'prefix' => '', 
], 

У меня есть еще две миграции с таким же поведением. Странное это я уже сделал что-то вроде этого (добавив столбец строки) к одной из этих таблиц, и у меня не было никакой необходимости комментировать содержание моего «вниз» метода на этом классе:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class AddPhotoColumnToClientsTable extends Migration 
{ 
    public function up() 
    { 
     Schema::table('clients', function (Blueprint $table) { 
      $table->string('photo')->nullable(); 
     }); 
    } 

    public function down() 
    { 
     Schema::table('clients', function (Blueprint $table) { 
      $table->dropColumn('photo'); 
     }); 
    } 
} 

Я не знаю, что случилось с столбцами «город» и «страна», добавленными в первую упомянутую миграцию.

Я создал все эти классы миграции из командной строки php artisan, поэтому я не изменил их структуру по умолчанию (примеры здесь не имеют комментариев, чтобы сделать их короткими), и я также проверил, что ни одна из этих миграций не ошибается кода по методу «вниз».

Я ничего там не вижу или есть какой-то предел Я забываю о SQLite или миграции?

Вот результат с «вниз» метод прокомментировал:

PHPUnit 4.8.23 by Sebastian Bergmann and contributors. 

.............S............................................. 

Time: 42.4 seconds, Memory: 47.25Mb 

OK, but incomplete, skipped, or risky tests! 
Tests: 59, Assertions: 215, Skipped: 1. 

И это результат, если я раскомментировать или все из «вниз» метод линий содержания:

PHPUnit 4.8.23 by Sebastian Bergmann and contributors. 

E 

Time: 1.74 seconds, Memory: 20.75Mb 

There was 1 error: 

1) AuthTest::a_client_user_can_login_via_api 
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 no such column: country (SQL: CREATE TEMPORARY TABLE __temp__clients AS SELECT id, user_id, cell_phone, photo, created_at, updated_at, deleted_at, country FROM clients) 

C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:669 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:629 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:409 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Schema\Blueprint.php:83 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Schema\Builder.php:203 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Schema\Builder.php:128 
C:\My Project\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php:221 
C:\My Project\database\migrations\2016_03_12_002857_add_city_and_country_column_to_client.php:28 
C:\My Project\database\migrations\2016_03_12_002857_add_city_and_country_column_to_client.php:28 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Migrations\Migrator.php:233 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Migrations\Migrator.php:181 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Console\Migrations\RollbackCommand.php:63 
C:\My Project\vendor\laravel\framework\src\Illuminate\Container\Container.php:507 
C:\My Project\vendor\laravel\framework\src\Illuminate\Console\Command.php:169 
C:\My Project\vendor\symfony\console\Command\Command.php:256 
C:\My Project\vendor\laravel\framework\src\Illuminate\Console\Command.php:155 
C:\My Project\vendor\symfony\console\Application.php:791 
C:\My Project\vendor\symfony\console\Application.php:186 
C:\My Project\vendor\symfony\console\Application.php:117 
C:\My Project\vendor\laravel\framework\src\Illuminate\Console\Application.php:64 
C:\My Project\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php:159 
C:\My Project\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithConsole.php:25 
C:\My Project\vendor\laravel\framework\src\Illuminate\Foundation\Testing\DatabaseMigrations.php:12 
C:\My Project\vendor\laravel\framework\src\Illuminate\Foundation\Testing\TestCase.php:127 
C:\Users\TheWindowsUser\AppData\Roaming\Composer\vendor\phpunit\phpunit\src\TextUI\Command.php:149 
C:\Users\TheWindowsUser\AppData\Roaming\Composer\vendor\phpunit\phpunit\src\TextUI\Command.php:100 

Caused by 
PDOException: SQLSTATE[HY000]: General error: 1 no such column: country 

C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:408 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:662 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:629 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:409 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Schema\Blueprint.php:83 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Schema\Builder.php:203 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Schema\Builder.php:128 
C:\My Project\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php:221 
C:\My Project\database\migrations\2016_03_12_002857_add_city_and_country_column_to_client.php:28 
C:\My Project\database\migrations\2016_03_12_002857_add_city_and_country_column_to_client.php:28 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Migrations\Migrator.php:233 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Migrations\Migrator.php:181 
C:\My Project\vendor\laravel\framework\src\Illuminate\Database\Console\Migrations\RollbackCommand.php:63 
C:\My Project\vendor\laravel\framework\src\Illuminate\Container\Container.php:507 
C:\My Project\vendor\laravel\framework\src\Illuminate\Console\Command.php:169 
C:\My Project\vendor\symfony\console\Command\Command.php:256 
C:\My Project\vendor\laravel\framework\src\Illuminate\Console\Command.php:155 
C:\My Project\vendor\symfony\console\Application.php:791 
C:\My Project\vendor\symfony\console\Application.php:186 
C:\My Project\vendor\symfony\console\Application.php:117 
C:\My Project\vendor\laravel\framework\src\Illuminate\Console\Application.php:64 
C:\My Project\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php:159 
C:\My Project\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithConsole.php:25 
C:\My Project\vendor\laravel\framework\src\Illuminate\Foundation\Testing\DatabaseMigrations.php:12 
C:\My Project\vendor\laravel\framework\src\Illuminate\Foundation\Testing\TestCase.php:127 
C:\Users\TheWindowsUser\AppData\Roaming\Composer\vendor\phpunit\phpunit\src\TextUI\Command.php:149 
C:\Users\TheWindowsUser\AppData\Roaming\Composer\vendor\phpunit\phpunit\src\TextUI\Command.php:100 

FAILURES! 
Tests: 1, Assertions: 4, Errors: 1. 

Обновление

Кстати, я выполняю все свои тесты с помощью знака use Illuminate\Foundation\Testing\DatabaseMigrations;. Никакой специальной конфигурации не применяется или особых изменений в классах тестов по умолчанию, предоставляемых Laravel.

ответ

3

Либо разделить падение на два отдельных действия или поочередно передать массив, чтобы dropColumn столбцов, которые вы хотите сбросить.

Либо

Schema::table('clients', function (Blueprint $table) { 
    $table->dropColumn('country'); 
}); 

Schema::table('clients', function (Blueprint $table) { 
    $table->dropColumn('city'); 
}); 

или

$table->dropColumn(['country', 'city']); 

см https://github.com/laravel/framework/issues/2979

+0

Для тех, кто еще наткнуться этому вопросу, это решение работает и должен быть отмечен как ответ. Я пошел с добавлением каждого столбца, который нужно удалить, как часть массива '$ table-> dropColumn (['country', 'city']); – wired00