11

Ruby on Rails プロジェクトで BDD 開発に Cucumber を使用していますが、path.rb が Rails アプリケーションで使用されるパスを処理する方法について混乱しています。

私が持っているとすれば:

class Parent < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
  belongs_to :parent
end

そして、私は次のCucumber機能を持っています:

Scenario: A test feature
    Given I am on the parent page
     When I follow "Link to Children"
     Then I should be on the children list page

パスは次のように定義されています。

def path_to(page_name)
  case page_name
  when /the children list page/
       '/parents/:id/children'
end

私が遭遇する問題は、機能の実行時に次のエラーが発生することです。

Spec::Expectations::ExpectationNotMetError: expected: "/parents/:id/children",
 got: "/parents/1726/children" (using ==)

:id が何であるかはあまり気にしません。代わりに何をすべきですか?これは、デフォルトの Web ステップでも可能ですか? 問題について間違った方法で考えていますか?

4

2 に答える 2

18

最善の方法ではないかもしれませんが、私が行う方法は次のとおりです。

when /the children list page for "(.+)"/
    p = Parent.find_by_name($1)
    parent_children_path(p)
于 2010-01-15T23:01:52.480 に答える
2

私たちのアプリでは、ユーザーが「新規」ボタンをクリックするたびに、常にデータベースに新しいレコードが必要でした。したがって、コントローラーの新しいアクションは自動的に create を呼び出し、次に edit アクションにリダイレクトします。

ID が何であるかはあまり気にせず、アプリの編集ページに到達しただけで、テストでも同様の問題に直面しました。

これが私が思いついたものです。

(注: ステップ定義は capybara を使用して記述されてますが、webrat とあまり変わらないはずです)

Then /^(?:|I )should now be editing the (.*)$/ do |model|
  id = find_by_id("#{model}_id").value
  Then "I should be on the edit #{model} page for \"#{id}\""
end

基本的な前提は、Rails の編集ページにいるときに、編集中のモデルのフォームがあるということです。そのフォームには、編集中の特定のレコードの ID を持つ隠しフィールドが常に含まれています。

このステップは隠しフィールドを見つけ、そこから ID を抽出し、web_step を探してそのモデルのパスを解決します。

探しているモデルに一致するパスがあることを確認してください。

when /the edit person page for "([^\"]*)"/
  edit_person_path($1)
于 2010-07-08T00:16:37.870 に答える