【问题标题】:PhpUnit giving errror at second test functionPhpUnit 在第二个测试函数中给出错误
【发布时间】:2015-06-01 05:13:10
【问题描述】:

我正在尝试使用 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 个项目,它应该做的。但是第二个测试显示了上面的错误。

【问题讨论】:

    标签: testing phpunit laravel-5 sql-insert


    【解决方案1】:

    看起来数据库插入命令在第一次测试后失败了。可能有多种原因。

    我认为您应该考虑使用https://github.com/laracasts/TestDummy - 它旨在允许您为所有测试提供虚假数据。它还会在每次测试之间自动重置您的数据库(使用事务)。

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

    【讨论】:

    • @Pedro Silva - 这对您的问题有帮助吗?您需要更多信息吗?
    • 我会试一试,但我不明白为什么它会失败,如果在第一次测试中我插入 100 次它不会失败...
    • 好吧 testDummy 没有解决问题,我仍然在数据库中得到插入错误...:S
    • 我认为它与这个 github.com/laravel/framework/issues/1181 有关系,你在那里发表了评论,你在 laravel 5 中对此有什么了解吗?
    【解决方案2】:

    所以解决方案是在 setUp() 方法上写下这行代码:

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

    问题可能出在 laravel 框架上。

    【讨论】:

    • 你为什么不use DatabaseMigrations;
    猜你喜欢
    • 2016-05-21
    • 2016-06-12
    • 2010-09-23
    • 2017-10-19
    • 2016-06-04
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多