模拟GraphQL响应(实验性)
QueueTestNetworkTransport
是一个高级测试API,允许您指定由您的GraphQL客户端实例返回的ApolloClient
响应。
另请参阅MockServer
,该程序创建了一个完整的HTTP服务器并帮助测试特定的服务器行为,如错误情况、HTTP标头和超时。
将依赖项添加到您的项目build.gradle
文件中:
build.gradle[.kts]
dependencies {testImplementation("com.apollographql.apollo3:apollo-testing-support:3.8.5")}// Also add jcenter() to your repositories// See https://github.com/Kotlin/kotlinx-nodejs/issues/16repositories {mavenCentral()jcenter()}
通过将其传递给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
。