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