Rubí pepino cotizaciones multilínea con interpolación?
-
09-10-2019 - |
Pregunta
Estoy usando Pepino para enviar en JSON para algunas acciones de la API. En un caso, necesito saber el ID de un objeto que fue construida antes de la llamada a la API y pasar ese ID en.
Quiero hacer esto:
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
Lo que no funciona, ya que la cadena """
hace las variables prescinde de ella como una cadena entre comillas dobles haría. El paso I have already built a document
construye el objeto @document
, así que no sé de antemano lo que va a ser mi ID. Si importa, estoy usando MongoDB con MongoId, y mis esfuerzos para establecer manualmente una identificación han sido infructuosos.
¿Hay una manera limpia para lograr esto?
Medio ambiente:
ruby: 1.8.7
rails: 3.0.1
cucumber: 0.9.4
cucumber-rails: 0.3.2
Solución
Cambiar a la sintaxis ERB (<%= ... %>
), y luego en su definición de paso, ejecute la cadena a través de ERB:
require 'erb'
When %r{^I POST (.+) with data:$} do |path, data_str|
data = ERB.new(data_str).result(binding)
# ...
end
Otros consejos
ERB es una forma de evaluación Defer, pero tal vez, Theo, esto es un poco más limpio?
Las dos mitades de esto son el lado escenario:
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
Y al lado del paso de definición:
When %r{^I POST (.+) with data:$} do |path, data_str|
# assuming @document is in scope...
data = eval(data_str)
# ...
end
Yo recomendaría el uso de esquemas y ejemplos de escenarios utilizando algo así como
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 |
en los ejemplos. Eso que quede claro que los valores provienen de al menos. Control de sustitución en el escenario contornos aquí http://cukes.info/step-definitions.html