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.
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.
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.
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.
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.