测试构建器(实验性)
.css-154yii{-webkit-text-decoration:underline;text-decoration:underline;text-decoration-style:dotted;text-decoration-thickness:1.5px;text-decoration-color:var(--chakra-colors-gray-300);text-underline-offset:0.2em;}.css-154yii:hover,.css-154yii[data-hover]{cursor:help;}.chakra-ui-dark .css-154yii:not([data-theme]),[data-theme=dark] .css-154yii:not([data-theme]),.css-154yii[data-theme=dark]{text-decoration-color:var(--chakra-colors-blue-400);}Apollo Kotlin 提供了 测试构建器,它们允许您使用默认值创建您的 GraphQL 模型类的实例。测试构建器和具有大量 字段 或深度嵌套层次结构的模型一起测试尤其有用。它们会自动填充所需字段的值,并为其他字段自动设置模拟值。__typename
字段,并在可能的情况下移除合并的字段冗余。
启用测试构建器
默认情况下,测试构建器是 未启用 的,因为它们不是每个应用程序都需要的,并且会生成额外的代码。要启用它们,将 generateTestBuilders
选项设置为 true
:
apollo {service("service") {// ...// Enable test builder generationgenerateTestBuilders.set(true)}}
这将为您的 操作中使用的每个模型生成一个构建器 DSL。这些 DSL 依赖于每个模型的 字段。使用 DSL,您可以设置特定测试所需字段的值,而为其他字段自动设置模拟值。
示例用法
假设我们要构建一个测试,该测试使用以下 查询 的模拟结果:
query HeroForEpisode($ep: Episode!) {hero(episode: $ep) {firstNamelastNameageship {modelspeed}friends {firstNamelastName}... on Droid {primaryFunction}... on Human {height}}}
以下是我们可以如何使用针对该模拟结果的相应测试构建器的示例
// Import the query's test builderimport com.example.test.HeroForEpisodeQuery_TestBuilder.Data@Testfun test() {val data = HeroForEpisodeQuery.Data {// Set values for particular fields of the queryhero = humanHero {firstName = "John"age = 42friends = listOf(humanFriend {firstName = "Jane"},humanFriend {lastName = "Doe"})ship = ship {model = "X-Wing"}}}assertEquals("John", data.hero.firstName)assertEquals(42, data.hero.age)}
在本示例中,hero
字段是一个具有指定firstName
和age
值的Human
对象。字段lastName
和height
将自动填充模拟值。类似地,船的速度、第1个朋友的姓氏和第2个朋友的名字也将自动填充。
您可以将上面的humanHero
替换为droidHero
来创建一个Droid
对象,或者指定otherHero
来创建既不是Human
也没有是Droid
的对象。
配置默认字段值
要将默认值分配给字段,测试构建器使用TestResolver
接口的实现。默认情况下,它们使用DefaultTestResolver
的实例。
DefaultTestResolver
为每个String
字段提供了作为其默认值的字段名,并且在分配默认值给Int
字段时增加一个计数器。它为其他类型定义了类似的默认行为。
您可以创建自己的自定义 TestResolver
实现(可选地扩展DefaultTestResolver
以开始)。然后,您将这个实现作为参数传递到Data
函数中,如下所示:
// A TestResolver implementation that assigns -1 to all Int fieldsval myTestResolver = object : DefaultTestResolver() {override fun resolveInt(path: List<Any>): Int {return -1}}@Testfun test() {val data = HeroForEpisodeQuery.Data(testResolver = myTestResolver) {hero = humanHero {firstName = "John"}}// Unspecified Int field is -1assertEquals(-1, data.hero.age)}