我正在开发一个大型Laravel应用程序,目前版本为8.45.1,从未进行过测试,所以我正在努力使其达到可以开始编写单元&功能测试。
我遇到了一个问题,两个请求类(AppCoreRequest
和AppCoreFormRequest
(都使用一个特性RequestTrait
,该特性包含一组实用程序方法。
这显然在本地/暂存/生产中运行良好,但当我运行测试套件时,它抱怨说该特性提供的方法都不存在:
Method IlluminateHttpRequest::isFromTrustedSource does not exist.
它们在不同的地方被称为Request::isFromTrustedSource()
或request()->isFromTrustedSource()
。
我可以想象,当在测试环境中运行应用程序时,请求可能会有所不同。是使用了不同的类,还是由于某种原因该特性不适用?
我想,我发现了你的问题-App\Core\Request扩展了Illuminate\Http\Request,在index.php中你使用了App\Core\Request
问题出现在Illuminate\Foundation\Testing\Consults\MakesHttpRequests::call((中
当您使用$this->在测试套件中获取(…(-此方法引导具有标准请求的应用程序-而不是使用您的app\Core\request
您可以在basetests/TestCase.php中重写此方法并传递自己的请求。
不幸的是,它没有合同,你不能通过$this->应用程序->bind((
类似这样的东西:
class TestCase extends BaseTestCase
{
public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
{
//other code
$response = $kernel->handle(
$request = AppCoreRequest::createFromBase($symfonyRequest)
);
//other code
}
}