Testing PhpUnit在第二个测试函数中给出错误

Testing PhpUnit在第二个测试函数中给出错误,testing,phpunit,laravel-5,sql-insert,Testing,Phpunit,Laravel 5,Sql Insert,我试图用phpunit对我的数据库进行测试,并将数据库迁移到内存中 第一次测试运行正常: /** @test */ public function it_fetches_a_single_ano_letivo() { $this->makeAnoLetivo(); $this->getJson('/v1/anos-letivos'); $this->assertResponseOk();

我试图用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.
所以第一个函数运行得很好,但是第二个函数相同,并且失败了。。。 另外,如果我创建第三个相等的值,只有第一个会通过

编辑1: 因此,它在第一次测试中插入得很好,它回滚数据库并再次迁移它以进行下一次测试,并且数据库中的插入表示ID可能不为NULL,因此create方法似乎不再知道如何在第一次测试后插入数据库。。。仍然不知道是什么原因导致了这种情况,迁移是正确的,而且回滚也很好

编辑2:
我试着对生产数据库运行测试,结果很好。因此,问题一定出在内存数据库或内存数据库上的任何配置上。但我不知道是什么问题,因为第一次测试我得到绿色,它插入数据没有问题,我甚至可以在第一次测试中插入10个项目,它做它应该做的。但是第二个测试显示了上面的错误。

在第一个测试之后,数据库插入命令似乎失败了。可能有很多原因

我认为你应该考虑使用它,它可以让你为所有的测试提供假数据。它还将使用事务在每次测试之间自动重置数据库


这是一个很棒的工具-试一试

因此解决方案是在设置方法上写下以下几行:

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

问题可能出在拉威尔框架中。

@Pedro Silva-这对你的问题有帮助吗?你需要更多的信息吗?我会尝试一下,但我不知道为什么失败,如果在第一次测试中我插入了100次它没有失败…那么testDummy没有解决问题,我仍然在数据库中得到插入错误…:我认为这与github.com/laravel/framework/issues/1181有关,您在那里发表了评论,您知道laravel 5中的相关内容吗?为什么不使用DatabaseMigrations;?