4

RubyonRailsを使用して開発しているアプリケーションに次の表があります。 代替テキスト

テーブルからユーザーを選択して削除または編集するキュウリでテストを作成したいと思います。

そのためのステップ定義が何であるかわかりません。

私は次のようなことができるようになりたいです:

Feature: User Manegement
         In order to manage users
         As an admin 
         I want to see a users list and change user properties

Background:
Given the following activated users exists
  | name         | email                    | 
  | Alice Hunter | alice.hunter@example.com |
  | Bob Hunter   | bob.hunter@example.com   |
And the following user records
  | name     | email                    | 
  | Jonh Doe | jonh.doe@example.com     |

    Scenario: I delete a user from the table
      Given I am logged in as admin
      When I follow "Administration"
      And I follow "User Management"
      And I delete "Alice Hunter"
      Then I should not see "Alice Hunter"`

誰か助けてもらえますか?ありがとうございました。

@brad

返されたエラー:

  wrong number of arguments (2 for 1) (ArgumentError)
  ./features/step_definitions/table_steps.rb:26:in `within'
  ./features/step_definitions/table_steps.rb:26:in `/^I delete "(.*)"$/'


4

5 に答える 5

2

便利なリンクIDやクラス(つまり、class = "deleteLink")に関してもうまくいかないレガシーアプリが少しあります。hrefで「delete」のあるリンクを見つける必要があります。明らかにこれはエラーが発生しやすいですが、今のところは機能しています。そのためのコードは次のとおりです。

When /^I delete "([^"]*)"$/i do |value|
  page.evaluate_script('window.confirm = function() { return true; }') 
  within(:xpath, "//tr[.//*[contains(text(), '#{value}')]]") do
    find(:xpath, ".//a[contains(@href,'delete')]").click
  end
end

xpathでは少し厄介ですが、最終的にはそれが機能するようになりました。私はCucumber/Rspec / Capybara/Seleniumを使用してJavaアプリをテストしています。

于 2010-12-23T02:46:22.173 に答える
2

広範囲にわたる検索とマイナーなリファクタリングの後、私はなんとか問題を解決することができました。

私は次のステップを使用しました:

When /^as admin I (press|follow|check|uncheck|choose) "([^\"]*)" for (.*) whose (.*) is "([^\"]*)"$/ do |action, whatyouclick, class_name, var_name, value|
  unless var_name == "id" then
    id = eval("\"#{class_name}\".classify.constantize.find_by_#{var_name}(\"#{value}\").id.to_s")
  else
    id = value
  end
  within("tr[id=as_admin__#{class_name}-list-#{id}-row]") do
    case action
      when "press"
        click_button(whatyouclick)
      when "follow"
        click_link(whatyouclick)
      when "check"
        check(whatyouclick)
      when "uncheck"
        uncheck(whatyouclick)
      when "choose"
        uncheck(whatyouclick)
    end
  end
end

私もwebratのRDocに興味を持っていますが、見つけたものはすべて故障しているようです。

于 2010-11-25T22:40:49.430 に答える
1

他のものはかなり標準的であるため、私はあなたを混乱させているのは削除部分であると仮定します(与えられたものを設定し、リンクをたどるなど...)

では、ブラウザの抽象化として何を使用していますか?Webrat?カピバラ?「削除」リンクがあるように見えますが、このようなことを行うだけで十分ですか?

And /I delete "(.*)"/ do |person|
  # Use webrat or capybara to find row based on 'person' text... then find 'delete' link in row and click it
  # example (untested, pseudo code)
  within(:xpath, "//table/tr[contains(#{person})") do
    find('.deleteLink').click
  end
end

そして、「見るべきではない」のようなものは、生成されたwebrat/capybaraステップで箱から出してすぐにサポートされると思います。

これはあなたが探しているものですか?

于 2010-11-22T18:56:56.170 に答える
1

同じ問題が発生し、「I follow "abcd"」からclick_link()への翻訳を調べたところ、オプションの:methodがあることがわかりました。だから私はこれを定義しました:

When /^(?:|I )follow "([^"]*)" as delete$/ do |link|
  click_link(link, :method => :delete)
end

そしてそれはうまくいきました...それから私はそれを単に「削除として」ではなく、より一般的にすることに決めました:

When /^(?:|I )follow "([^"]*)" as ([a-z]+)$/ do |link,method|
  click_link(link, :method => method.to_sym)
end

よく働く。「getとして「mylink」をフォローします」で試してみましたが、うまくいったので、メソッド部分は適切に柔軟に見えます。

于 2011-03-14T00:35:36.843 に答える
0

以下のブラッドの答えに続いて、私は一緒に行きました:

When /^I follow "([^"]*)" for "([^"]*)"$/ do |link, person|
  # Use capybara to find row based on 'person' text... no need for the additional 'find'
  # the '.,' sets the scope to the current node, that is the tr in question
  within(:xpath, "//table/tr[contains(.,'#{person}')]") do
    click_link(link)
  end
end
于 2011-10-01T06:24:00.343 に答える