2017-05-28 4 views
0

J'écris des tests pour une API qui devrait envoyer des informations de la base de données (PostreSQL) à partir d'une requête GET. Cependant, ma requête RSpec GET refuse de renvoyer des valeurs.RSPec Demande GET ne renvoyant pas correctement les valeurs de la base de données

C'est le test:

describe FullTextController do 
    context 'when doing a simple search', :type => :request do 
    it 'return the correct results' do 
     create(:etablissement, nom: "foobarcompany") 
     create(:etablissement, nom: "foobarcompany2") 
     create(:etablissement, nom: "foobarcompany3") 
     create(:etablissement, nom: "foobarcompany4") 
     sleep 2 
     get "/full_text/:id", :params => { id: 'foobarcompany' } 

     expect(body_as_json).to match({ 
     total_results: 1, 
     total_pages: 1, 
     per_page: 10, 
     page: 1, 
     etablissement: 1, 
     }) 
    end 
    end 

Il est censé tester ce contrôleur:

class FullTextController < ApplicationController 
    def show 

    page = params[:page] || 1 

    search = Etablissement.search do 
     fulltext params[:id] 
     paginate page: page, per_page: 10 
    end 

    results = search.results 

     results_payload = { 
     total_results: search.total, 
     total_pages: results.total_pages, 
     per_page: results.per_page, 
     page: page, 
     etablissement: results 
     } 

     render json: results_payload, status: 200 
    end 
    end 

    def full_text_params 
    params.permit(:id, :page) 
    end 
end 

Les itinéraires de config/routes.rb:

Rails.application.routes.draw do 
    get 'siret/:id' => 'siret#show' 
    get 'full_text/:id' => 'full_text#show' 
end 

La sortie de le test:

 expected {"total_results"=>0, "total_pages"=>0, "per_page"=>10, "page"=>1, "etablissement"=>[]} to match {:total_results=>1, :total_pages=>1, :per_page=>10, :page=>1, :etablissement=>1} 
    Diff: 
    @@ -1,6 +1,6 @@ 
    -:etablissement => 1, 
    -:page => 1, 
    -:per_page => 10, 
    -:total_pages => 1, 
    -:total_results => 1, 
    +"etablissement" => [], 
    +"page" => 1, 
    +"per_page" => 10, 
    +"total_pages" => 0, 
    +"total_results" => 0, 

Il devrait trouver au moins 1 résultat, mais il continue à montrer zéro. J'ai déjà vérifié que j'étais sur la bonne base de données de test et que les modèles créés (etablissement) étaient dans la base de données.

+0

avez-vous essayé de définir un 'binding.pry' dans le scénario de test. Ce cas de test échoue-t-il dans le contrôleur pour sélectionner la variable 'etablissement'? –

+0

Je viens de vérifier en ajoutant 'binding.pry' juste après la requête GET, Si je tape" response "alors j'obtiens la réponse vide, si je tape' Etablissement.all' alors je reçois zéro. Ce qui est bizarre parce que si je fais une demande d'Etablissement dans le code de test, j'obtiens un résultat: 'puts Etablissement.first.name' retournera" foobarcompany " Malheureusement, je n'ai jamais utilisé binding.pry auparavant. Que me conseillez-vous d'essayer? –

+0

Ok, si le problème est que 'Etablissement' n'est pas sauvegardé dans le test db quand vous faites' create (: etablissement' je vous suggère d'y retourner dans debug et de vérifier 'etablissement.errors.full_messages' et de vérifier s'il y a quelques erreurs lors de la sauvegarde de l'enregistrement –

Répondre

0

L'appel get doit suivre la structure suivante: full_text/:id avec la partie :id en cours de remplacement par le id réel que vous voulez passer. Rails considérera la partie id comme un paramètre dans le contrôleur. Il est en fait pas un param du point de vue de l'url (params sont ce qui viennent après?, Comme ?param1=value1&param2=value2)

Ce que vous faites ici est get "/full_text/:id", :params => { id: 'foobarcompany' } qui se traduit par /full_text/:id?id=foobarcompany

Vous voulez utiliser get "/full_text/foobarcompany" à la place