从全栈Web开发背景出发,我最近开始构建一个Unity 3D可视化项目,使用Unity作为移动/Web客户端来渲染3D模型,并通过HTTP API调用到后端服务器来获取一些数据。

有React经验后,我寻找了Unity中的Mock Service Worker等价物 - 来拦截Unity客户端发出的HTTP API调用,返回一些假数据,保持零修改的应用程序代码,并在最终构建或发布生产时完全清除。

注意,我不是测试服务器,而是测试客户端渲染部分(因为Unity Web/Mobile应用程序只是客户端)

Unity中找到的最接近的解决方案是这个文章,它将UnityWebRequest包裹在一个接口中,以便在单元测试级别注入模拟数据。

但这仅仅让我走到了这一步,因为单元测试模拟数据并没有解决其他Play模式测试问题。

  • 单元测试不足。我不仅需要我的测试通过。 我需要点击一个按钮,玩游戏时看到实际发生的事情。 单元测试不能展示这些。 UI可以,仅在Play模式下展示。

  • 本地主机隐藏了延迟。 本地主机响应是瞬时的,所以你永远看不到加载状态(如旋转器)。 只有在真实连接(或在Web开发时启用Chrome DevTools)时,你才能看到你的待处理UI状态。 除非你故意模拟延迟每个端点(通过添加一些延迟代码)。

#if UNITY_EDITOR 积累的块。由于没有服务器,我在编辑器保护中硬编码了每个假响应。 一开始似乎没问题,但它们很快就积累了,并且散布在整个代码库中。 将它们散布在我的神圣代码中,未来我不会高兴。

  • 没有多个环境:即使我在本地主机上启动了一个服务器来提供数据,我的本地主机基准URL也会在多个地方硬编码。 在发布到生产或测试环境时,需要进行查找和替换。 它工作,但每次都感觉不错,而且我很想有专门的.env文件(用于本地/开发/生产/测试等环境)。

  • 未测试的错误路径。 我无法强制后端返回401或模拟超时 - 所以我的错误处理代码存在,但从未测试过。 和那些从未运行的代码一样写成。 我使用了一个本地节点json-server并编辑了json,但与其他团队成员共享它很难,因为你只能有一个db.json的快照,它服务,并且错过了各种错误/延迟路径我测试过,因此其他人可以重用。

  • 模拟和API契约无法扩展到Git外。 Postman API集合不会更新你的代码,不会分支你的特性,不会显示在diff中,并且必须手动与每个新团队成员共享。 在Web开发中,我喜欢使用Bruno,允许我将API契约存储为json,并使用Swagger/OpenAPI规范来将API契约暴露给团队。

  • 没有API请求/响应LOG历史记录在Play模式下。 当会话中出现问题时,你想看到发送的确切内容、返回的内容以及它们的顺序。 除了在Debug.Log中添加一些代码之外,我没有办法查看API调用在Play会话中的LOG。

  • 分页和多响应流。 如果你的端点在第一个调用、第二个调用和第三个调用中返回不同的数据 - 分页、重试逻辑、状态变化 - 单个硬编码的模拟响应就无法覆盖。 你需要将一系列响应队列起来并按顺序服务它们,以便请求到来时。 否则你只会测试第一个调用中的快乐路径。 没有后端服务器使测试变得困难。

  • 最后,Unity和外部ApiClient之间的不断切换。 每当我想要快速测试一个端点时,我都必须离开Unity,打开Postman/Bruno,设置调用,检查响应,回来。 我只想在编辑器中拥有一个API客户端 - 发送一个请求,查看响应,保持上下文。

因此,我构建了一个资产,作为Unity中的拦截器层 - 介于游戏代码和网络之间,路由到编辑器中的模拟数据,允许真实请求在构建时通过,#if保护中没有任何块,什么也不需要清除。 延迟和错误代码可以在每个端点上配置,环境使用{{baseUrl}}令牌并且可以在一个点击中从本地到开发到测试到生产之间切换,端点可以队列多个响应并按顺序服务它们以支持分页和重试流,会话日志可以查看最后1000次Play会话中的API请求/响应列表,内置的API客户端可以在Unity中发送请求而无需离开,模拟配置存储在游戏库中并且像任何其他资产一样随着代码库一起旅行,模拟配置可以使用内置API客户端共享和访问其他团队成员。

它在Asset Store上作为“API Mocking Toolkit”发布,如果你面临着同样的问题。 我很好奇其他游戏开发者/WEB开发者是否也遇到了这个问题,如何解决这个问题(免费/付费)。 或者我是否错过了一个显而易见的解决方案,重新发明了轮子?