我正在尝试获得一个简单的重定向来与 GuzzleHttp 一起使用,并使用 phpunit 来测试我的代码。预期的行为是,如果请求的 URL 以“/”结尾,则响应应该重定向到去掉尾随“/”的同一 URL。
这就是我的
App.php
的样子 :
<?php
namespace Framework;
use GuzzleHttp\Psr7\Response;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class App {
public function run(ServerRequestInterface $request): ResponseInterface {
$uri= $request->getUri()->getPath();
if (!empty($uri) && $uri[-1] === "/") {
$response= new Response();
$response= $response->withStatus(301);
$response= $response->withHeader('Location', substr($uri, 0, -1));
}
$response= new Response();
$response->getBody()->write('Hello.');
return $response;
}
}
我在
AppTest.php
中运行测试,如下所示:
<?php
namespace Tests\Framework;
use Framework\App;
use GuzzleHttp\Psr7\ServerRequest;
use PHPUnit\Framework\TestCase;
class AppTest extends TestCase {
public function testRedirectTrailingSlash() {
$app= new App();
$request= new ServerRequest('GET', '/some-slug/');
$response= $app->run($request);
$this->assertContains('/some-slug', $response->getHeader('Location'));
$this->assertEquals('301', $response->getStatusCode());
}
}
当我运行此测试时,两个断言都失败,这是由于响应的状态代码为
200
并且标头列表为空,我通过执行 var_dump()
确认了这一点。
最奇怪的是,我几个月前写了这段代码,它起作用了,据我记得,从那时到现在我所做的唯一一件事就是
composer install
,所以我不知道这是否是由于依赖项的最新更新。
有人可以帮我吗?
但是在安装 Composer 之前如何运行此代码?