【问题标题】:Laravel 5.8 Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiableLaravel 5.8 目标 [Illuminate\Contracts\Debug\ExceptionHandler] 不可实例化
【发布时间】:2020-05-20 22:09:26
【问题描述】:

我正在将我的 PHP 5.4、Laravel 4.2 应用程序升级到 PHP 7.4、Laravel 5.8。

在我的一些测试中,在 tearDownAfterClass 上,我会做一些 DB 清理工作。在 Laravel 5.8 中,这些都不起作用,我不知道为什么。

以下使用 Laravel 5.4 的测试有效。用 5.8 就不行了。

我已经从默认值更新了我的 5.8 配置,它们是正确的。 我的数据库连接正常,测试全部通过数据库活动。

该错误仅在静态 tearDownAfterClass 中失败,我将相同的 \DB::table(static::$audittable)->truncate(); 添加到我的一项测试中,它可以正常工作。

如何解决以下异常?

使用 PHP 7.4.6、Laravel 5.8:

class ModelAuditQueriesTest extends TestCase
{
  static $audittable = 'contactnotesaudit';

  public static function tearDownAfterClass()
  {
    \DB::table(static::$audittable)->truncate(); **// <-- this fails, error below; line 11**
    parent::tearDownAfterClass();
  }

  public function testInsertSingle()
  {
    \DB::table(static::$audittable)->truncate(); **// <-- this works, no errors**
    /**
     * testing stuff with models that insert and select with database, successfully
     */
  }
}

使用 PHPUNIT.XML,processIsolation = false

PHP Fatal error:  Uncaught Illuminate\Contracts\Container\BindingResolutionException: Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiable. in C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Container\Container.php:960
Stack trace:
#0 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Container\Container.php(794): Illuminate\Container\Container->notInstantiable('Illuminate\\Cont...')
#1 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Container\Container.php(667): Illuminate\Container\Container->build('Illuminate\\Cont...')
#2 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Container\Container.php(615): Illuminate\Container\Container->resolve('Illuminate\\Cont...', Array)
#3 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(767): Illuminate\Container\Container->make('Illuminate\\Cont...', Array)
#4 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php(170): Illuminate\Foundation\Application->make('Illuminate\\ in C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Container\Container.php on line 960
PHP Fatal error:  Uncaught Illuminate\Contracts\Container\BindingResolutionException: Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiable. in C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Container\Container.php:960
Stack trace:
#0 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Container\Container.php(794): Illuminate\Container\Container->notInstantiable('Illuminate\\Cont...')
#1 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Container\Container.php(667): Illuminate\Container\Container->build('Illuminate\\Cont...')
#2 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Container\Container.php(615): Illuminate\Container\Container->resolve('Illuminate\\Cont...', Array)
#3 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(767): Illuminate\Container\Container->make('Illuminate\\Cont...', Array)
#4 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php(170): Illuminate\Foundation\Application->make('Illuminate\\ in C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Container\Container.php on line 960

使用 PHPUNIT.XML,processIsolation = true

PHP Fatal error:  Uncaught Error: Class 'DB' not found in C:\CODE\IDWEB5\tests\commonmodelaudit\ModelAuditQueriesTest.php:11
Stack trace:
#0 C:\CODE\IDWEB5\vendor\phpunit\phpunit\src\Framework\TestSuite.php(760): Tests\commonmodelaudit\ModelAuditQueriesTest::tearDownAfterClass()
#1 C:\CODE\IDWEB5\vendor\phpunit\phpunit\src\TextUI\TestRunner.php(545): PHPUnit\Framework\TestSuite->run(Object(PHPUnit\Framework\TestResult))
#2 C:\CODE\IDWEB5\vendor\phpunit\phpunit\src\TextUI\Command.php(195): PHPUnit\TextUI\TestRunner->doRun(Object(PHPUnit\Framework\TestSuite), Array, true)
#3 C:\CODE\IDWEB5\vendor\phpunit\phpunit\src\TextUI\Command.php(148): PHPUnit\TextUI\Command->run(Array, true)
#4 C:\CODE\IDWEB5\vendor\phpunit\phpunit\phpunit(53): PHPUnit\TextUI\Command::main()
#5 {main}
  thrown in C:\CODE\IDWEB5\tests\commonmodelaudit\ModelAuditQueriesTest.php on line 11

Error : Cannot use object of type Illuminate\Support\Facades\Config as array
 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Database\DatabaseManager.php:270
 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Database\DatabaseManager.php:101
 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Database\DatabaseManager.php:77
 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Database\DatabaseManager.php:349
 C:\CODE\IDWEB5\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php:239
 C:\CODE\IDWEB5\tests\commonmodelaudit\ModelAuditQueriesTest.php:11

我已运行以下命令以确保一切正常:

composer dump-autoload
php artisan clear-compiled
php artisan optimize
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    我认为应用程序已经在代码的tearDownAfterClass 部分关闭。

    由于您尝试截断表格,我想您可能会发现使用 trait DatabaseTransactions 会更容易,例如

    class ModelAuditQueriesTest extends TestCase
    {
      use DatabaseTransactions;
    }
    

    这将使您在此测试期间在数据库中所做的任何更改都不会回滚,因为它们都是在从未提交的事务中完成的。

    另一种做你想做的事情的黑客方法是“重新启动”应用程序。

    样板文件中的TestCase 有一个特征CreatesApplication。不幸的是,这不是静态的,但您可以复制粘贴它并“重新启动”应用程序:

    class ModelAuditQueriesTest extends TestCase
    {
      static $audittable = 'contactnotesaudit';
    
      public static function tearDownAfterClass()
      {
        $app = require __DIR__.'/../bootstrap/app.php'; //You might need to adjust the path
        $app->make(Kernel::class)->bootstrap();
        \DB::table(static::$audittable)->truncate();
        parent::tearDownAfterClass();
      }
    }
    

    现在不幸的是,您看到的错误是无法实例化错误处理程序,这意味着一旦您这样做,您将看到错误处理程序被实例化的实际原因,这可能是另一个异常。但是,至少这可能会提供更多信息。

    【讨论】:

    • 感谢您的回复。应用程序在 tearDownAfterClass 关闭,这是我的问题。谢谢你的建议,我会考虑的。我有数百个这样的测试,所以我需要一些更易于管理的东西。
    猜你喜欢
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多