【问题标题】:Laravel testing requestsLaravel 测试请求
【发布时间】:2021-09-28 21:29:45
【问题描述】:

我正在开发一个大型 Laravel 应用程序,目前在 v8.45.1 上从未进行过测试,所以我正在努力让它达到我们可以开始编写单元和功能测试的地步。

我遇到了一个问题,即两个请求类(App\Core\RequestApp\Core\FormRequest)都使用一个特征 RequestTrait,它包含一组实用方法。

这在本地/暂存/生产中显然可以正常工作,但是当我运行测试套件时,它抱怨该特征提供的方法都不存在:

Method Illuminate\Http\Request::isFromTrustedSource does not exist.

他们在不同的地方被称为Request::isFromTrustedSource()request()->isFromTrustedSource()

我可以想象在测试环境中运行应用程序时,请求可能会有所不同。是使用了不同的类,还是由于某种原因该特征不适用?

【问题讨论】:

  • 不要混淆 Illuminate\Http\Request 和 FormRequest - 这是不同的东西。请展示您的测试用例
  • 您的应用似乎以某种方式覆盖了默认请求对象,但您的测试似乎并没有这样做,因此解决这个问题取决于这种交换是如何发生的,以及在测试初始化​​
  • @Maksim 我没有混合 Request 和 FormRequest - 我只是说该特征适用于两者。测试用例只是开箱即用的 Feature/ExampleTest,它检查主路径 (/) 是否返回 200。
  • App\Core\Request 扩展了 Illuminate\Http\Request?
  • @Maksim 是的

标签: php laravel testing request traits


【解决方案1】:

我想,我发现了你的问题 - App\Core\Request 扩展了 Illuminate\Http\Request 并且在 index.php 中你使用 App\Core\Request

问题出在 Illuminate\Foundation\Testing\Concerns\MakesHttpRequests::call()

当您在测试套件中使用 $this->get(...) 时 - 此方法使用标准请求引导应用程序 - 而不是您的 App\Core\Request

您可以在基本测试/TestCase.php 中覆盖此方法并传递您自己的请求。

不幸的是,它没有合同,你不能通过 $this->app->bind() 使用它

类似这样的:

class TestCase extends BaseTestCase
{
    public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
    {
    //other code
    $response = $kernel->handle(
        $request = \App\Core\Request::createFromBase($symfonyRequest)
    );
    //other code
    }
}

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 2021-12-23
    • 2021-01-25
    • 2021-07-28
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    相关资源
    最近更新 更多