4

我在使用 ruby​​ on rails 开发的应用程序中有下表: 替代文字

我想在黄瓜中创建一个测试,我从表中选择一个用户并将其删除或编辑。

我不知道它的步骤定义是什么。

我希望能够做类似的事情:

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"`

任何人都可以帮忙吗?谢谢你。

@布拉德

返回的错误:

  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 中找到“删除”的链接。显然这很容易出错,但它现在正在工作。这是代码。

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 应用程序 BTW。

于 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

我遇到了同样的问题,并查看“我跟随“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

效果很好。我也尝试使用“我按照“mylink”作为获取方式进行尝试,并且效果很好,因此方法部分似乎具有适当的灵活性。

于 2011-03-14T00:35:36.843 回答
1

我将假设是删除部分让你感到困惑,因为其他东西是相当标准的(设置给定和跟踪链接等......)

那么,您使用什么作为浏览器抽象?韦拉特?水豚?看起来好像您有一个“删除”链接,这样做就足够了吗?

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 回答
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 回答