GraphQL

Mirage 带有用于模拟 RESTful API 的一流辅助函数,但目前它没有开箱即用的 GraphQL 支持。 这就是 Mirage GraphQL 库派上用场的地方。

Mirage GraphQL 提供了有用的函数来为您的 GraphQL 终结点创建请求处理器,以及可以选择创建您自己的自定义解析器。

要开始使用,请从 Mirage GraphQL 导入 createGraphQLHandler 函数,并传入您的 GraphQL 和 Mirage 模式。 Mirage GraphQL 将尽最大努力自动为您解析 GraphQL 查询。

在以下示例中,您不需要为任何查询或突变提供自己的解析器。 此外,您不需要创建任何 Mirage 模型。 Mirage GraphQL 将根据您的 GraphQL 模式为您创建模型。

在 REPL 中试用此示例!
import { createServer } from "miragejs"
import { createGraphQLHandler } from "@miragejs/graphql"

const graphQLSchema = `
  input MovieInput {
    title: String
  }

  type Movie {
    id: ID!
    title: String!
  }

  type Mutation {
    createMovie(input: MovieInput!): Movie
    deleteMovie(id: ID!): Movie
    updateMovie(id: ID!, input: MovieInput!): Movie
  }

  type Query {
    movies(title: String): [Movie]
    movie(id: ID, title: String): Movie
  }
`

createServer({
  routes() {
    this.post("/graphql", createGraphQLHandler(graphQLSchema, this.schema))
  },
  
  seeds(server) {
    server.create("Movie", {
      title: "The Lord of the Rings: The Fellowship of the Ring"
    })
    server.create("Movie", {
      title: "The Lord of the Rings: The Two Towers"
    })
    server.create("Movie", {
      title: "The Lord of the Rings: The Return of the King"
    })
  },
})

// Get a movie by its title
const movieQuery = `
query Movie($id: ID, $title: String) {
  movie(id: $id, title: $title) {
    id
    title
  }
}
`

request(
  "/graphql",
  movieQuery,
  { variables: { title: "The Lord of the Rings: The Two Towers" } }
).then(/* ... */)

// Add a movie
const createMovieMutation = `
mutation CreateMovie($input: MovieInput!) {
  createMovie(input: $input) {
    id
    title
  }
}
`

request(
  "/graphql",
  createMovieMutation,
  { variables: { title: "The Hobbit: An Unexpected Journey" } }
).then(/* ... */)

注意:此示例位于单个文件中以保持简单。 在真正的应用程序中,您应该从单独的文件中导入您的 GraphQL 模式。

Mirage GraphQL 可以做很多事情。 例如,您可以

  • 提供您自己的解析器,以便您可以执行诸如排序结果或在一次突变中添加三部电影之类的事情
  • 向处理器提供上下文对象,以便您可以模拟用户身份验证之类的事情
  • 为处理器提供一个根对象,以防您的后端有一个根对象并且您需要模拟它

等等。

Mirage GraphQL 是 v0.1.x,但从 ember-cli-mirage-graphql 库多年工作中提取而来。

要了解更多信息,请查看 Mirage GraphQL 的自述文件。 另外,请查看集成测试以获取有关选项、查询和突变的更深入的示例。

Mirage & graphql-mocks

作为使用 Mirage 和 GraphQL 进行模拟的非官方社区替代方案,请查看 graphql-mocks 及其 Mirage 中间件

考虑使用 graphql-mocks 与 Mirage 一起使用,用于

  • 用于管理和创建不同场景和状态的组合中间件
  • 用于扩展查询解析的解析器和解析器映射抽象
  • 在 Node 环境中进行模拟
  • 使用不同的网络抽象(Mock Service Worker、Nock 等)灵活地进行模拟
  • graphql 类型完全兼容的 TypeScript 支持和类型