Comment envoyer des premières données de postes dans les Rails de test fonctionnel?
Je suis à la recherche d'envoyer des premières données de postes (par exemple, unparamaterized JSON) à l'un de mes contrôleurs pour les essais de:
class LegacyOrderUpdateControllerTest < ActionController::TestCase
test "sending json" do
post :index, '{"foo":"bar", "bool":true}'
end
end
mais cela me donne un NoMethodError: undefined method `symbolize_keys' for #<String:0x00000102cb6080>
erreur.
Quelle est la bonne façon d'envoyer les premières données de postes dans ActionController::TestCase
?
Voici quelques contrôleur de code:
def index
post_data = request.body.read
req = JSON.parse(post_data)
end
- Je suis curieux de savoir comment vous faites cela, aussi, pour tester un basé sur JSON API.
Vous devez vous connecter pour publier un commentaire.
J'ai couru à travers le même problème et trouvé une solution.
Dans votre
test_helper.rb
définir la méthode suivante à l'intérieur deActiveSupport::TestCase
:Dans votre test fonctionnel, s'utilise comme un
post
méthode mais passer le raw post-corps en tant que troisième argument.J'ai testé sur des Rails 2.3.4 lors de la lecture du raw post-corps à l'aide de
au lieu de
Si vous regardez la le code source vous verrez que
raw_post
juste enveloppementsrequest.body.read
avec un chèque de ceRAW_POST_DATA
dans lerequest
env de hachage.begin; ... ensure
autour de lapost
appel pourrait être une bonne idée.post
est une Chaîne de caractères, il sera considéré comme leRAW_POST_DATA
. par exemple,post :create, '{"foo": "bar", "bool": true}'
J'ai effectivement résolu les mêmes questions, tout en ajoutant une ligne
avant de simuler la rspec requête post. Ce que vous faites
est de remplir le "RAW_POST_DATA". J'ai essayé de le supprimer
les attributs de la var sur le post :créer, mais si je le fais,
il ne trouve pas l'action.
Ici ma solution.
Dans le contrôleur le code que vous avez besoin de lire le JSON est
quelque chose de semblable à ce
attributes
envoyé à la poste.En regardant la trace de pile d'exécution d'un test, vous pouvez acquérir plus de contrôle sur demande la préparation:
ActionDispatch::Intégration::RequestHelpers.post => ActionDispatch::Intégration::Session.processus =>
Rack::Test::Session.env_for
Vous pouvez passer chaîne json comme :params ET spécifiez un type de contenu "application/json". Dans d'autres cas type de contenu sera mis à "application/x-www-form-urlencoded" et votre json sera analysée correctement.
De sorte que tous vous avez besoin est de préciser "CONTENT_TYPE":
post
(qui appelleprocess
). Si le premier arg après l'action est une Chaîne de caractères, il sera lu commeRAW_POST_DATA
.Pour ceux qui utilisent Rails5+ tests d'intégration, l' (sans-papiers) façon de le faire est de passer une chaîne de caractères dans les params argument, donc:
Si vous utilisez RSpec (>= la version 2.12.0) et la rédaction des specs de Requête, le module qui est inclus est
ActionDispatch::Integration::Runner
. Si vous regardez le code source, vous pouvez remarquer que le post les appels de méthode processus qui accepte unrack_env
paramètre.Tout cela signifie que vous pouvez simplement effectuer les opérations suivantes dans votre spec:
Et dans le contrôleur:
Version de Rails 5:
Voir ici -
body
paramètre de chaîne est traitée comme raw du corps de la requête.À l'aide de Rails 4, je cherchais à le faire pour tester le traitement de xml brut, qui a été affiché sur le contrôleur. J'ai été capable de le faire en fournissant simplement le string pour le post:
Je crois que si le paramètre fourni est une chaîne de caractères, il devient simplement transmis au contrôleur que le corps.
post
peut être une Chaîne ou IO, et qui devient le corps.La
post
méthode attend un hachage de paires nom-valeur, de sorte que vous aurez besoin de faire quelque chose comme ceci:Puis, dans votre contrôleur, d'obtenir les données à être analysé comme ceci:
Comme des Rails 4.1.5, c'était la seule chose qui a fonctionné pour moi:
pour une url /comptes/5/commandes/10/éléments. Il obtient l'url params transmis ainsi que le JSON corps. Bien sûr, si les ordres ne sont pas incorporées ensuite, vous pouvez laisser de côté les params de hachage.
Dans les rails, 5.1 les travaux suivants, pour moi, quand vous faites une demande de suppression que les données nécessaires dans le corps:
REMARQUE: Cela ne fonctionne que lorsque vous faites un test d'Intégration.
J'ai été chercher très longtemps pour savoir comment post raw contenu JSON dans un test d'intégration (Rails 5.1). Je suppose que ma solution pourrait aussi aider dans ce cas.
J'ai regardé la documentation et le code source pour le
post
méthode: https://api.rubyonrails.org/v5.1/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-postCela m'a dirigé vers la
process
méthode pour plus de détails: https://api.rubyonrails.org/v5.1/classes/ActionDispatch/Integration/Session.html#method-i-processGrâce à cela, j'ai enfin trouvé ce qu'paramètres sont acceptées par le
process
et doncpost
méthode.Voici ce que ma solution finale ressemblait: