加入我们,从10月8日至10日在纽约市,了解 GraphQL 联邦和 API 平台工程的最新技巧、趋势和新闻。参加在纽约市的 2024 年 GraphQL 大会
文档
免费开始
您正在查看此软件先前版本的文档。 切换到最新稳定版本。

测试构建器(实验性)


⚠️ 测试构建器是基于响应的并且可能会生成大量代码。向前发展,我们建议使用数据构建器,它们更容易使用。此页面仅供参考。

.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);} 提供了 测试构建器,它们允许您使用默认值创建您的 模型类的实例。测试构建器和具有大量 或深度嵌套层次结构的模型一起测试尤其有用。它们会自动填充所需字段的值,并为其他字段自动设置模拟值。__typename ,并在可能的情况下移除合并的字段冗余。

启用测试构建器

默认情况下,测试构建器是 未启用 的,因为它们不是每个应用程序都需要的,并且会生成额外的代码。要启用它们,将 generateTestBuilders 选项设置为 true:

build.gradle[.kts]
apollo {
service("service") {
// ...
// Enable test builder generation
generateTestBuilders.set(true)
}
}

这将为您的 中使用的每个模型生成一个构建器 DSL。这些 DSL 依赖于每个模型的 字段。使用 DSL,您可以设置特定测试所需字段的值,而为其他字段自动设置模拟值。

示例用法

假设我们要构建一个测试,该测试使用以下 的模拟结果:

query HeroForEpisode($ep: Episode!) {
hero(episode: $ep) {
firstName
lastName
age
ship {
model
speed
}
friends {
firstName
lastName
}
... on Droid {
primaryFunction
}
... on Human {
height
}
}
}

以下是我们可以如何使用针对该模拟结果的相应测试构建器的示例

// Import the query's test builder
import com.example.test.HeroForEpisodeQuery_TestBuilder.Data
@Test
fun test() {
val data = HeroForEpisodeQuery.Data {
// Set values for particular fields of the query
hero = humanHero {
firstName = "John"
age = 42
friends = listOf(
humanFriend {
firstName = "Jane"
},
humanFriend {
lastName = "Doe"
}
)
ship = ship {
model = "X-Wing"
}
}
}
assertEquals("John", data.hero.firstName)
assertEquals(42, data.hero.age)
}

在本示例中,hero 字段是一个具有指定firstNameage值的Human对象。字段lastNameheight将自动填充模拟值。类似地,船的速度、第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 fields
val myTestResolver = object : DefaultTestResolver() {
override fun resolveInt(path: List<Any>): Int {
return -1
}
}
@Test
fun test() {
val data = HeroForEpisodeQuery.Data(testResolver = myTestResolver) {
hero = humanHero {
firstName = "John"
}
}
// Unspecified Int field is -1
assertEquals(-1, data.hero.age)
}
下一步
开始学习
评价文章评价在 GitHub 上编辑编辑论坛Discord

©2024Apollo Graph Inc.,也称为 Apollo GraphQL。

隐私政策

公司