[RUBY] Différents tests GraphQL

introduction

Récemment, j'ai implémenté une API avec Graphql-ruby. Bien sûr, j'ai besoin d'écrire un test pour graphql, mais il semble y avoir différentes méthodes, donc je vais le résumer en mémorandum.

Comment accéder à l'API

Tout d'abord, je vais expliquer comment accéder à l'API. Ce qui suit est un exemple.

spec.rb


RSpec.describe User, type: :request do
  describe 'user' do
    it 'L'USR spécifié peut être obtenu' do
      user = create(:user)

      post '/graphql', params: { query: query(id: user.id) }
      json = JSON.parse(response.body)
      data = json['data']['user']

      expect(data).to include(
        'id' => user.id
      )
      end
    end
  end

  def query(id:)
    <<~GRAPHQL
      query {
        user(id: "#{id}"){
          id
          name
        }
      }
   GRAPHQL
  end
end

Il s'agit d'une implémentation simple consistant à définir une requête et à la publier sur une API locale. Cependant, cela présente certains points problématiques comme suit.

Comment frapper exécuter

Ensuite, c'est une méthode pour exécuter directement. C'est aussi de l'exemple

spec.rb


RSpec.describe User, type: :request do
  describe 'user' do
    it 'L'USR spécifié peut être obtenu' do
      user = create(:user)
      
      #Remplacez AppSchema par le nom de schéma défini
      ret = AppSchema.execute(query(id: user.id) context:{current_user: user})
      data = ret['data']['user']

      expect(data).to include(
        'id' => user.id
      )
      end
    end
  end

  def query(id:)
    <<~GRAPHQL
      query {
        user(id: "#{id}"){
          id
          name
        }
      }
   GRAPHQL
  end
end

J'ai reçu une perspective et une réponse de json, et la description a disparu, ce qui l'a rendu un peu plus propre. De plus, il est facile à tester car vous pouvez passer le contexte comme argument. En revanche, écrire une requête ou extraire un identifiant du format json est fastidieux. Le format json est assez peu pratique, surtout lorsque la requête est compliquée et que l'imbrication est profonde.

Comment toucher uniquement le résolveur

Jetons un œil à un exemple.

spec.rb


RSpec.describe User, type: :request do
  describe 'resolver' do
    it 'Ce que l'utilisateur peut obtenir' do
      user = create(:user)

     # class_name est le nom de classe de la résolution dans laquelle la logique est écrite
      mutation = [class_name].new(field: nil, object: nil, context:{current_user: user})
      ret = mutation.resolve(id: user.id)
      expect(ret).to eq user
    end
  end
end

C'était plutôt chouette. Comme vous pouvez le voir, je lis la méthode de résolution directement en créant une nouvelle classe dans laquelle la résolution est écrite. Avec cette méthode, la valeur de retour est un objet utilisateur, ce qui rend le test très facile à écrire.

Comment utiliser

Dans mon cas, j'utilise la méthode d'appel de execute directement lors du test de l'interface avec le front tel que ObjectType, et la méthode d'appel du résolveur directement lors du test d'une autre logique. J'utilise rarement la méthode pour accéder à la première API.

Jusqu'à présent, j'ai résumé les méthodes de test que je connais. Je serais reconnaissant si quelqu'un pouvait dire qu'il existe d'autres bonnes façons.

Recommended Posts

Différents tests GraphQL
Différents tests de méthode avec MockRestServiceServer
FizzBuzz divers