You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在visionOS沉浸式空间应用单元测试中访问Scene实例

解决visionOS RealityView单元测试中无法获取Scene实例的问题

你遇到的核心问题是单元测试中无法依赖RealityView的SwiftUI生命周期来获取Scene实例——RealityView必须在SwiftUI View的body中渲染才能触发make闭包,直接初始化RealityView不会执行闭包逻辑,导致你的continuation永远无法resume,最终泄漏报错。

最优解决方案:脱离RealityView,直接操作RealityKit底层API

RealityKit的Scene本身是可以独立实例化的,不需要绑定SwiftUI的RealityView。单元测试中完全可以手动创建Scene、添加实体、执行射线检测,全程不依赖SwiftUI的渲染流程。

以下是完整的单元测试示例:

import XCTest
import RealityKit

class RaycastCollisionTests: XCTestCase {
    func testRaycastHitsTargetEntity() {
        // 1. 手动创建RealityKit Scene实例
        let testScene = RealityKit.Scene()
        
        // 2. 创建带碰撞组件的测试实体
        let targetEntity = Entity()
        // 添加盒子碰撞形状,模拟实际应用中的实体碰撞体
        targetEntity.components[CollisionComponent.self] = CollisionComponent(
            shapes: [.box(size: SIMD3<Float>(1, 1, 1))],
            mode: .default
        )
        // 设置实体位置,确保在射线路径上
        targetEntity.position = SIMD3<Float>(0, 0, -2)
        
        // 3. 将实体添加到测试场景
        testScene.addEntity(targetEntity)
        
        // 4. 构建射线检测参数
        let rayStart = SIMD3<Float>(0, 0, 0)
        let rayEnd = SIMD3<Float>(0, 0, -5)
        let rayDirection = normalize(rayEnd - rayStart)
        let rayLength = distance(rayStart, rayEnd)
        
        // 5. 执行射线检测
        let collisionHits = testScene.raycast(
            from: rayStart,
            direction: rayDirection,
            length: rayLength,
            query: .face,
            mask: .default,
            relativeTo: nil
        )
        
        // 6. 验证检测结果
        XCTAssertFalse(collisionHits.isEmpty, "射线未命中任何实体")
        XCTAssertEqual(collisionHits.first?.entity, targetEntity, "命中的实体与预期不符")
    }
}

方案说明

  • 完全脱离SwiftUI的RealityView:不需要等待任何异步闭包,直接同步创建Scene和实体,避免continuation泄漏问题。
  • 逻辑与应用层对齐:你可以在测试中完全复现应用里的实体层级、碰撞体设置、变换参数,保证测试结果的准确性。
  • 高效且可控:单元测试可以快速执行,不需要依赖UI渲染流程,适合批量验证射线检测逻辑。

内容的提问来源于stack exchange,提问作者Reinhard Männer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:55:04