2010-12-07 7 views
2

J'utilise Cucumber pour envoyer en 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 ID dansRuby Citations multilignes de concombre avec interpolation?

Je veux faire.

Scenario: Creating a print from an existing document 
    Given I am logged in as "[email protected]" 
     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 """ n'interpole pas les variables comme le ferait une chaîne entre guillemets. L'étape I have already built a document génère l'objet @document, donc je ne sais pas à l'avance quel sera mon ID. Si c'est important, j'utilise MongoDB avec mongoid, et mes efforts pour définir manuellement un identifiant se sont avérés infructueux.

Existe-t-il un moyen propre d'accomplir ceci?

Environnement:

ruby: 1.8.7 
rails: 3.0.1 
cucumber: 0.9.4 
cucumber-rails: 0.3.2 
+0

Est-ce que les documents ici (voir http://web.njit.edu/all_topics/Prog_Lang_Docs/html/ruby/syntax.html#here_doc) fonctionnent dans le concombre? Je ne peux pas trouver une source fiable à ce sujet, donc je le laisse comme commentaire pour l'instant ... –

+0

Non, ils ne le font pas. – jdl

+0

Eh bien, c'est malheureux. :-( –

Répondre

3

changement à 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 
+0

C'est beau, merci! – jdl

+1

Oh, non, c'est pas beau, mais je suis content que vous l'aimiez, je préférerais résoudre le problème en faisant une étape personnalisée, quelque chose comme "Quand je POST/api/impressions avec le document actuel "et ensuite construire les données POST dans la définition de l'étape.Avoir la variable dans le scénario se sent très hackish – Theo

+0

Hey Theo, voir ma réponse ci-dessous.Je ne pense pas que @document dans le scénario est sale - il fait l'étape flexible et combinable avec d'autres étapes à condition qu'ils définissent @document.Et bien que ERB est agréable, pourquoi ne pas s'en tenir à la syntaxe simple si vous pouvez vous en sortir? –

2

ERB est un moyen de reporter l'évaluation, mais Théo, c'est peut-être 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 "[email protected]" 
    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 
+0

J'ai modifié votre correction pour vous. – jdl

1

Je recommande le scénario en utilisant les contours et les 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 indiquerait clairement d'où proviennent les valeurs. Vérifiez la substitution dans les schémas de scénario ici http://cukes.info/step-definitions.html