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
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top