2

私はCucumberを使用してJSONをいくつかのAPIアクションに送信しています。ある例では、API呼び出しの前に構築されたオブジェクトのIDを知り、そのIDをに渡す必要があります。

私はこれをしたい:

  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

"""文字列は二重引用符で囲まれた文字列のように変数を補間しないため、これは機能しません。このI have already built a documentステップで@documentオブジェクトが作成されるため、IDが何になるかは事前にわかりません。重要なのは、私はMongoDBとmongoidを使用しており、IDを手動で設定するという私の努力は実を結ばないことが証明されています。

これを達成するためのクリーンな方法はありますか?

環境:

ruby: 1.8.7
rails: 3.0.1
cucumber: 0.9.4
cucumber-rails: 0.3.2
4

3 に答える 3

3

ERB構文(<%= ... %>)に変更し、ステップ定義で、ERBを介して文字列を実行します。

require 'erb'

When %r{^I POST (.+) with data:$} do |path, data_str|
  data = ERB.new(data_str).result(binding)
  # ...
end
于 2010-12-07T14:47:15.713 に答える
2

ERBは評価を延期する1つの方法ですが、おそらくTheo、これは少しクリーンですか?

これの2つの半分は、シナリオ側です。

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

そして、ステップ定義側:

When %r{^I POST (.+) with data:$} do |path, data_str|
  # assuming @document is in scope...
  data = eval(data_str)
  # ...
end
于 2010-12-07T19:27:20.170 に答える
1

シナリオの概要と例を使用することをお勧めします

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     |

例では。それは、値が少なくともどこから来たのかを明らかにするでしょう。ここでシナリオの概要の置換を確認してくださいhttp://cukes.info/step-definitions.html

于 2014-06-26T14:22:31.537 に答える