Files
framework/tests/ApiVersionTest.php
2026-01-06 12:44:28 +08:00

75 lines
2.2 KiB
PHP

<?php
namespace think\tests;
use Mockery as m;
use PHPUnit\Framework\TestCase;
use think\Request;
use think\Route;
class ApiVersionTest extends TestCase
{
use InteractsWithApp;
/** @var Route */
protected $route;
protected function setUp(): void
{
$this->prepareApp();
$this->route = new Route($this->app);
}
protected function tearDown(): void
{
m::close();
}
protected function makeRequest($path, $method = 'GET', $version = null)
{
$request = m::mock(Request::class)->makePartial();
$request->shouldReceive('host')->andReturn('localhost');
$request->shouldReceive('pathinfo')->andReturn($path);
$request->shouldReceive('url')->andReturn('/' . $path);
$request->shouldReceive('method')->andReturn(strtoupper($method));
// 修改header方法的mock
if ($version !== null) {
$request->shouldReceive('header')->andReturnUsing(function($name) use ($version) {
return $name === 'Api-Version' ? $version : null;
});
}
return $request;
}
public function testApiVersionFromHeader()
{
$this->route->group('api', function () {
$this->route->get('products', function () {
return 'v1 products';
})->version('1.0');
$this->route->get('products', function () {
return 'v2 products';
})->version('2.0');
});
// 测试请求头版本1.0
$request = $this->makeRequest('api/products', 'GET', '1.0');
// 添加调试信息
try {
$response = $this->route->dispatch($request);
$this->assertEquals('v1 products', $response->getContent());
} catch (\think\exception\RouteNotFoundException $e) {
var_dump($request->header('Api-Version')); // 检查版本号是否正确传入
throw $e;
}
// 测试请求头版本2.0
$request = $this->makeRequest('api/products', 'GET', '2.0');
$response = $this->route->dispatch($request);
$this->assertEquals('v2 products', $response->getContent());
}
}