getAttributes(Prefix::class); $versionAttrs = $reflection->getAttributes(Version::class); $middlewareAttrs = $reflection->getAttributes(Middleware::class); $this->assertCount(1, $prefixAttrs); $this->assertCount(1, $versionAttrs); $this->assertCount(1, $middlewareAttrs); // 检查方法级别的属性 $methods = $reflection->getMethods(); // 查找 getUsers 方法 $getUsersMethod = null; foreach ($methods as $method) { if ($method->getName() === 'getUsers') { $getUsersMethod = $method; break; } } $this->assertNotNull($getUsersMethod); $getAttrs = $getUsersMethod->getAttributes(Get::class); $this->assertCount(1, $getAttrs); } /** @test */ public function it_can_create_route_attribute_instances() { // 测试创建路由属性实例 $reflection = new ReflectionClass(TestController::class); $methods = $reflection->getMethods(); // 查找 createUser 方法 $createUserMethod = null; foreach ($methods as $method) { if ($method->getName() === 'createUser') { $createUserMethod = $method; break; } } $this->assertNotNull($createUserMethod); // 获取 Post 属性实例 $postAttrs = $createUserMethod->getAttributes(Post::class); $this->assertCount(1, $postAttrs); $postInstance = $postAttrs[0]->newInstance(); $this->assertInstanceOf(Post::class, $postInstance); $this->assertEquals('users', $postInstance->path); } /** @test */ public function it_supports_multiple_middleware_attributes() { // 测试重复的中间件属性支持 $reflection = new ReflectionClass(TestController::class); $methods = $reflection->getMethods(); // 查找 createUser 方法(应该有两个中间件:类级别的 auth 和方法级别的 admin) $createUserMethod = null; foreach ($methods as $method) { if ($method->getName() === 'createUser') { $createUserMethod = $method; break; } } $this->assertNotNull($createUserMethod); $middlewareAttrs = $createUserMethod->getAttributes(Middleware::class); // 方法级别应该有一个 Middleware 属性 $this->assertCount(1, $middlewareAttrs); // 类级别的 Middleware 属性也需要被检测到 $classMiddlewareAttrs = $reflection->getAttributes(Middleware::class); $this->assertCount(1, $classMiddlewareAttrs); } /** @test */ public function it_can_override_version_attribute() { // 测试版本属性覆盖 $reflection = new ReflectionClass(TestController::class); $methods = $reflection->getMethods(); // 查找 getPost 方法(应该覆盖类级别的版本) $getPostMethod = null; foreach ($methods as $method) { if ($method->getName() === 'getPost') { $getPostMethod = $method; break; } } $this->assertNotNull($getPostMethod); $versionAttrs = $getPostMethod->getAttributes(Version::class); $this->assertCount(1, $versionAttrs); $versionInstance = $versionAttrs[0]->newInstance(); $this->assertEquals('v3', $versionInstance->version); } /** @test */ public function it_can_parse_class_file_for_namespace_and_class_name() { // 测试从文件中解析命名空间和类名 $content = file_get_contents(__DIR__.'/../Fixtures/Controllers/TestController.php'); $namespace = null; $class = null; if (preg_match('/namespace\s+(.+?);/', $content, $ns) && preg_match('/class\s+(\w+)/', $content, $cls)) { $namespace = $ns[1]; $class = $cls[1]; } $this->assertEquals('Jltx\Routes\Tests\Fixtures\Controllers', $namespace); $this->assertEquals('TestController', $class); } }