Ruby concombre Les citations multi-ligne avec interpolation?
-
09-10-2019 - |
Question
J'utilise Concombre d'envoyer JSON à certaines actions de l'API. Dans un cas, je dois connaître l'ID d'un objet qui a été construit avant l'appel de l'API et de transmettre cet identifiant dans.
Je veux faire ceci:
Scenario: Creating a print from an existing document
Given I am logged in as "foo@localhost.localdomain"
And I have already built a document
When I POST /api/prints with data:
"""
{
"documentId":"#{@document.id}",
"foo":"bar",
"etc":"etc"
}
"""
Then check things
Ce qui ne fonctionne pas, car la chaîne de """
ne pas les variables Interpole comme une chaîne entre guillemets serait. L'étape de I have already built a document
construit l'objet @document
, donc je ne sais pas à l'avance ce que mon ID sera. Si cela importe, j'utilise MongoDB avec MongoId, et mes efforts pour régler manuellement un ID se sont avérées infructueuses.
Y at-il un moyen propre pour y parvenir?
Environnement:
ruby: 1.8.7
rails: 3.0.1
cucumber: 0.9.4
cucumber-rails: 0.3.2
La solution
Modification de la syntaxe ERB (<%= ... %>
), puis dans la définition de votre étape, exécutez la chaîne par ERB:
require 'erb'
When %r{^I POST (.+) with data:$} do |path, data_str|
data = ERB.new(data_str).result(binding)
# ...
end
Autres conseils
ERB est un moyen d'évaluation defer, mais peut-être, Théo, c'est un peu plus propre?
Les deux moitiés de ce sont du côté du scénario:
Scenario: Creating a print from an existing document
Given I am logged in as "foo@localhost.localdomain"
And I have already built a document
When I POST /api/prints with data:
# outer, single quotes defer evaluation of #{@document}
'{
"documentId":"#{@document.id}",
"foo":"bar",
"etc":"etc"
}'
Then check things
Et du côté de la définition de l'étape:
When %r{^I POST (.+) with data:$} do |path, data_str|
# assuming @document is in scope...
data = eval(data_str)
# ...
end
Je recommande d'utiliser les contours du scénario et des exemples en utilisant quelque chose comme
Scenario Outline: Posting stuff
....
When I POST /api/prints with data:
"""
{
"documentId": <document_id>,
"foo":"bar",
"etc":"etc"
}
"""
Then check things
Examples: Valid document
| document_id |
| 1234566 |
Examples: Invalid document
| document_id |
| 6666666 |
dans les exemples. Cela permettrait de préciser où les valeurs sont venus d'au moins. Consultez Remplacement pour le scénario Outlines ici http://cukes.info/step-definitions.html