最近,我看到一条消息说,GitHub将其API从REST迁移到了GraphQL。 这让我真的对GraphQL及其提供的功能感到好奇。 介绍 GraphQL是一种新的API设计范例,于2015年由Facebook开源,但自2012年以来一直为他们的移动应用提供动力。它消除了当今REST API的许多低效率问题。 与REST相比,GraphQL API仅公开一个端点,并且API的使用者可以精确地指定所需的数据。 在iOS开发中,我们可以利用Apollo iOS客户端的优势对GraphQL服务器执行查询和变异,并以查询特定的Swift类型返回结果。 这意味着您不必处理解析JSON或传递字典并使客户端将值手动转换为正确类型的麻烦。 您也不必自己编写模型类型,因为它们是从UI使用的GraphQL定义生成的。 为什么选择GraphQL? REST API公开了多个端点,每个端点都返回特定的信息。 例如,我有以下两个端点: / classes:返回类列表。 / classes / id / students:返回参加此课程的学生列表。 现在,如果我想显示所有班级的列表以及两名参加该班级的学生。 有两种选择: 修改现有的API,使响应在每个班级中包含两名学生的信息。 多次致电/ classes / id / students以获取我想要的信息。 它们都不是一个好的解决方案,因为将来很难扩展。 但是,我可以在GraphQL的单个请求中简单地指定数据要求。 响应将包含一系列班级以及两名学生。 先决条件 在本文中,我想实现一个非常简单的应用程序,该应用程序显示班级列表以及班级中的老师和学生。 但是,在我们开始之前,仍有几件事要做。 首先,有必要配备GraphQL服务器,而Graphcool是一个完美的选择。 访问该网站并按照说明创建一个名为Schedule的项目。 此外,将以下代码添加到Graphcool控制台中以创建必要的架构。 type Class implements Node { id: ID! @isUnique title: String! createdAt: DateTime! updatedAt: DateTime! […]
现在,我们有了一个可以正常运行的快速服务,该服务返回了名称空间域模型,我们可以为此类设计一种测试策略。 首先,我们要考虑对GraphQL进行完全模拟是否值得。 例如,您可以创建一个符合ApolloInterface的模拟对象,然后从那里编写单元测试。 相反,我们将模拟Apollo客户端,并使用残存的原始JSON实际执行Apollo查询。 这是理想的,因为我们实际上测试了代码如何与Apollo交互。 此外,您可以使用JSON和模拟的NetworkTransport对象在单元测试中模拟失败的网络或解析状态,从而使我们可以获得有关World.Store网络对象的更多测试范围。 此测试策略是从Apollo-iOS测试套件中借用的,您可以在此处查看源代码。 首先,让我们看一下模拟的NetworkTransport对象: 最初发布在 gist.github.com上 。