模拟 GraphQL 响应
测试网络传输目前在 Apollo Kotlin 中使用 实验性。如果您对它们有反馈,请通过GitHub 问题或Kotlin Slack 社区提出。
QueueTestNetworkTransport
是一个高级测试 API,可用于指定您的 GraphQL响应,这些响应由您的 ApolloClient
实例返回。
将依赖项添加到项目的 build.gradle
文件中:
dependencies {testImplementation("com.apollographql.apollo:apollo-testing-support:4.0.0")}
通过将其传递到 ApolloClient
构建器来启用 QueueTestNetworkTransport
:
val apolloClient = ApolloClient.Builder().networkTransport(QueueTestNetworkTransport()).build()
然后,您可以使用 enqueueTestResponse
扩展函数来指定要返回的 GraphQL 响应:
val testQuery = GetHeroQuery("001")val testData = GetHeroQuery.Data {hero = droidHero {name = "R2D2"}}apolloClient.enqueueTestResponse(testQuery, testData)val actual = apolloClient.query(testQuery).execute().data!!assertEquals(testData.hero.name, actual.hero.name)
您可以将一个ApolloResponse
对象传递给enqueueTestResponse
函数,或者作为快捷方式,您可以直接像上面那样传递一个Data
对象。如果传递了Data
对象,您还需要传递一个操作,因为底层数据结构需要在里面建立一个ApolloResponse的引用。
为了帮助创建模拟的响应数据,您可以使用数据构建器。
高级使用
QueueTestNetworkTransport
按照它们被入队时的顺序返回响应。
在某些测试中,将响应映射到操作可能更方便。
为了实现这一点,请使用MapTestNetworkTransport
,并调用registerTestResponse
扩展函数:
val apolloClient = ApolloClient.Builder().networkTransport(MapTestNetworkTransport()).build()apolloClient.registerTestResponse(query1, testData1)apolloClient.registerTestResponse(query2, testData2)val actual1 = apolloClient.query(query1).execute().dataval actual2 = apolloClient.query(query2).execute().data// Execute query1 again, which is mapped to testData1val actual3 = apolloClient.query(query1).execute().dataassertEquals(testData1, actual1)assertEquals(testData2, actual2)assertEquals(testData1, actual3)
如果需要对返回的响应有更多控制,您可以实现自己的NetworkTransport
并将其传递给ApolloClient
构建器:
private class CustomTestNetworkTransport : NetworkTransport {override fun <D : Operation.Data> execute(request: ApolloRequest<D>): Flow<ApolloResponse<D>> {return flowOf(ApolloResponse.Builder(/* Your custom logic here */).build() as ApolloResponse<D>)}override fun dispose() {}}apolloClient = ApolloClient.Builder().networkTransport(CustomTestNetworkTransport()).build()
请注意,如果您使用自定义的NetworkTransport
,则无法调用enqueueTestResponse()
或registerTestResponse()
,因为它们期望传输是QueueTestNetworkTransport
或MapTestNetworkTransport
。