2015-03-27 3 views
0

Я пытаюсь выполнить проверку моей базы данных с помощью phpunit, и я переношу базу данных в память.PhpUnit, дающий ошибку при второй тестовой функции

первый тестовый прогон просто отлично:

/** @test */ 
    public function it_fetches_a_single_ano_letivo() 
    { 
     $this->makeAnoLetivo(); 

     $this->getJson('/v1/anos-letivos'); 

     $this->assertResponseOk(); 
    } 

но второй тест не пройден, и его точно так же, как и первый:

 /** @test */ 
     public function it_fetches_anos_letivos() 
     { 
      $this->makeAnoLetivo(); 

      $this->getJson('/v1/anos-letivos'); 

      $this->assertResponseOk(); 
     } 

Вот функция makeAnoLetivo:

private function makeAnoLetivo($anoLetivoFields = []) 
    { 
     while($this->times--) 
     { 
      $ano1=$this->fake->year; 

      $anoLetivo = array_merge([ 
       'ano1' => $ano1+0, 
       'ano2' => $ano1+1 
      ], $anoLetivoFields); 

      AnoLetivo::create($anoLetivo); 

     } 
     } 

и здесь есть выход phpUnit:

Configuration read from {{PATH_TO_PROJECT}}/phpunit.xml 

..E 

Time: 2.62 seconds, Memory: 23.25Mb 

There was 1 error: 

1) AnosLetivosTest::it_fetches_anos_letivos 
Illuminate\Database\QueryException: SQLSTATE[23000]: Integrity constraint violation: 19 anos_letivos.id may not be NULL (SQL: insert into "anos_letivos" ("ano1", "ano2", "updated_at", "created_at") values (2009, 2010, 2015-03-27 18:41:59, 2015-03-27 18:41:59)) 

{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:620 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:576 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:359 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:316 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:1702 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:933 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1603 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1603 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1501 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:544 
{{PATH_TO_PROJECT}}/tests/AnosLetivosTest.php:50 
{{PATH_TO_PROJECT}}/tests/AnosLetivosTest.php:32 
phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:152 
phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:104 

Caused by 
PDOException: SQLSTATE[23000]: Integrity constraint violation: 19 anos_letivos.id may not be NULL 

{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:358 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:612 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:576 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:359 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Connection.php:316 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php:1702 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:933 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1603 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1603 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1501 
{{PATH_TO_PROJECT}}/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:544 
{{PATH_TO_PROJECT}}/tests/AnosLetivosTest.php:50 
{{PATH_TO_PROJECT}}/tests/AnosLetivosTest.php:32 
phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:152 
phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:104 

FAILURES!       
Tests: 3, Assertions: 5, Errors: 1. 

Итак, первая функция работает нормально, а вторая одна и не работает ... Также, если я создаю третью (равную), то будет проходить только первая.

EDIT 1: Так вставляет хорошо в первом тесте, это откаты БД и мигрирует это снова для следующего испытания и вставка в базе данных говорит идентификатор не может быть NULL, так что кажется, что создать метод больше не знает, как вставить в базу данных после того, как первый тест ... до сих пор не знаю, что вызывает это, мигрирует не является правильным, и это откат «ИНГ» тоже хорошо ...

Edit 2: Я попытался запустить тесты с производственной базой данных, и все работает отлично. Таким образом, проблема должна быть в базе данных памяти или любой конфигурации в этой базе данных памяти. Но я не знаю, в чем проблема, потому что первый тест я получаю зеленым, и он вставляет данные без проблем, я даже могу вставить 10 элементов в первый тест, и он делает то, что должен. Но второй тест показывает ошибку выше.

ответ

-1

Так что решение было писать эти строки на нАлАдкА() метод:

AnoLetivo::flushEventListeners(); 
AnoLetivo::boot(); 

проблема может быть в рамках Laravel.

+0

Почему вы не используете DatabaseMigrations; '? – surfer190

1

Похоже, что команда вставки базы данных терпит неудачу после первого теста. Может быть по ряду причин.

Я думаю, вам стоит подумать о том, чтобы использовать https://github.com/laracasts/TestDummy - он разработан, чтобы позволить вам иметь поддельные данные для всех ваших тестов. Он также автоматически сбросит вашу базу данных между каждым тестом (используя транзакции).

Его замечательный инструмент - дать ему идти

+1

@Pedro Silva - это помогло с вашим вопросом? Вам нужно больше информации? – Laurence

+0

Я дам ему попробовать, но я не понимаю, почему он терпит неудачу, если в первом тесте я вставляю 100 раз, это не сработает ... –

+0

Well testDummy не решила проблему, я все еще получаю ошибку вставки в БД ...: S –

Смежные вопросы