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 には、他にも多くの機能があります。例えば、次のことができます。

  • 独自のリゾルバーを提供して、結果をソートしたり、1 つのミューテーションで 3 つのムービーを追加したりすることができます。
  • ユーザー認証などのモックを作成できるように、コンテキストオブジェクトをハンドラに提供できます。
  • バックエンドにルートオブジェクトがある場合や、モックする必要がある場合は、ハンドラにルートオブジェクトを指定できます。

など。

Mirage GraphQL は v0.1.x ですが、ember-cli-mirage-graphql ライブラリでの長年の作業から抽出されたものです。

詳細については、Mirage GraphQL の README を確認してください。また、オプション、クエリ、ミューテーションの詳細な例については、統合テストも確認してください。

Mirage & graphql-mocks

Mirage と GraphQL によるモックの非公式なコミュニティベースの代替案として、graphql-mocks とその Mirage ミドルウェア を確認してください。

次のような目的で、Mirage で graphql-mocks を使用することを検討してください。

  • 異なるシナリオと状態を管理および作成するための、構成可能なミドルウェア
  • クエリ解決を拡張するための、リゾルバーとリゾルバーマップの抽象化
  • Node環境でのモック
  • さまざまなネットワーク抽象化(Mock Service Worker、Nockなど)を使用した柔軟なモック
  • 完全なTypeScriptサポートと、graphql型との型互換性