【问题标题】:Under Laravel Phpunit, BindingResolutionException is thrown when calling Illuminate config() helper inside Guzzle Promise在 Laravel Phpunit 下,在 Guzzle Promise 中调用 Illuminate config() 助手时会抛出 BindingResolutionException
【发布时间】:2020-07-11 17:14:27
【问题描述】:

我在控制器内调用 Guzzle Promise 下的全局帮助函数 config() 时收到 BindingResolutionException()。

运行 phpunit 时,Guzzle Promise 下似乎没有加载 Illuminate helpers.php。是错误还是我误用了什么?

以下是我的代码。 (这是一个新的 Laravel 项目)

脚本

./vendor/phpunit/phpunit/phpunit tests/MyTest.php

例外

Illuminate\Contracts\Container\BindingResolutionException {#448
  #message: "Target class [config] does not exist."
  #code: 0
  #file: "./vendor/laravel/framework/src/Illuminate/Container/Container.php"
  #line: 809
  -previous: ReflectionException {#540
    #message: "Class config does not exist"
    #code: -1
    #file: "./vendor/laravel/framework/src/Illuminate/Container/Container.php"
    #line: 807
    trace: {
      ./vendor/laravel/framework/src/Illuminate/Container/Container.php:807 { …}
      ./vendor/laravel/framework/src/Illuminate/Container/Container.php:685 { …}
      ./vendor/laravel/framework/src/Illuminate/Foundation/Application.php:794 { …}
      ./vendor/laravel/framework/src/Illuminate/Container/Container.php:633 { …}
      ./vendor/laravel/framework/src/Illuminate/Foundation/Application.php:779 { …}
      ./vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:119 { …}
      ./vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:275 { …}
      ./app/Http/Controllers/Controller.php:22 {
        App\Http\Controllers\Controller->App\Http\Controllers\{closure}
        › try {
        ›     dump(config('app.env'));
        › } catch (\Exception $e) {
        arguments: {
          $key: "app.env"
        }
      }
      ./vendor/guzzlehttp/promises/src/FulfilledPromise.php:39 { …}
      ./vendor/guzzlehttp/promises/src/TaskQueue.php:47 { …}
      ./vendor/guzzlehttp/promises/src/TaskQueue.php:26 { …}
      GuzzleHttp\Promise\TaskQueue->GuzzleHttp\Promise\{closure}() {}
    }
  }
  trace: {
    ./vendor/laravel/framework/src/Illuminate/Container/Container.php:809 { …}
    ./vendor/laravel/framework/src/Illuminate/Container/Container.php:685 { …}
    ./vendor/laravel/framework/src/Illuminate/Foundation/Application.php:794 { …}
    ./vendor/laravel/framework/src/Illuminate/Container/Container.php:633 { …}
    ./vendor/laravel/framework/src/Illuminate/Foundation/Application.php:779 { …}
    ./vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:119 { …}
    ./vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:275 { …}
    ./app/Http/Controllers/Controller.php:22 {
      App\Http\Controllers\Controller->App\Http\Controllers\{closure}
      › try {
      ›     dump(config('app.env'));
      › } catch (\Exception $e) {
      arguments: {
        $key: "app.env"
      }
    }
    ./vendor/guzzlehttp/promises/src/FulfilledPromise.php:39 { …}
    ./vendor/guzzlehttp/promises/src/TaskQueue.php:47 { …}
    ./vendor/guzzlehttp/promises/src/TaskQueue.php:26 { …}
    GuzzleHttp\Promise\TaskQueue->GuzzleHttp\Promise\{closure}() {}
  }
}

控制器

...
    public function index()
    {
        dump(config('app.env'));

        $promise = new FulfilledPromise(null);
        $promise->then(function () {
            try {
                dump(config('app.env'));
            } catch (\Exception $e) {
                dump($e);
            }
        });
        return response('ok', 200);
    }
...

测试

...
    public function testExample()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
...

composer.json

...
    "require": {
        "php": "^7.2.5",
        "fideloper/proxy": "^4.2",
        "fruitcake/laravel-cors": "^1.0",
        "guzzlehttp/guzzle": "^6.3",
        "laravel/framework": "^7.0",
        "laravel/tinker": "^2.0"
    },
    "require-dev": {
        "facade/ignition": "^2.0",
        "fzaninotto/faker": "^1.9.1",
        "mockery/mockery": "^1.3.1",
        "nunomaduro/collision": "^4.1",
        "phpunit/phpunit": "^8.5"
    },
...
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },

web.php

...
Route::get('/', 'Controller@index');

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    我最近遇到了这个问题,这是由于权限问题。 phpunit 需要对 .phpunit.result.cache 有写权限(至少)。

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 2021-09-15
      • 2016-06-24
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 2021-08-17
      相关资源
      最近更新 更多