Cucumber:从表中选择一个元素进行删除或添加

发布于 2024-10-04 12:47:48 字数 1562 浏览 3 评论 0原文

我正在使用 ruby​​ on Rails 开发的应用程序中有下表: alt text

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

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

我希望能够做这样的事情:

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 | [email protected] |
  | Bob Hunter   | [email protected]   |
And the following user records
  | name     | email                    | 
  | Jonh Doe | [email protected]     |

    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 "(.*)"$/'


I have the following table in an application I am developing using ruby on rails:
alt text

I want to create a test in cucumber where I select a user from the table and delete it or edit it.

I don't know what is the step definition for that.

I'd like to be able to do something like:

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 | [email protected] |
  | Bob Hunter   | [email protected]   |
And the following user records
  | name     | email                    | 
  | Jonh Doe | [email protected]     |

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

Can anyone help?
Thank you.

@brad

The error returned:

  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 "(.*)"$/'


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

┾廆蒐ゝ 2024-10-11 12:47:48

经过一些广泛的搜索和小的重构,我设法解决了这个问题。

我使用了以下步骤:

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 感兴趣,但我发现的所有内容似乎都乱了。

After some extensive searching and minor refactoring, I managed to solve the problem.

I have used the following step:

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

I am also insterested in webrat's RDoc, but everything I find seems out of order.

很酷不放纵 2024-10-11 12:47:48

我有一个遗留应用程序,对于有用的链接 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 应用程序。

I have a bit of a legacy app that isn't being nice with regard to useful link ids or even classes (i.e. class="deleteLink"). I have to find the link that has 'delete' in the href. Obviously this is error prone but it's working for now. Here's the code for that.

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

It's a little messy in the xpath, but it's what i could finally get to work. I'm using Cucumber/Rspec/Capybara/Selenium to test a Java app BTW.

彼岸花似海 2024-10-11 12:47:48

我假设删除部分让您感到困惑,因为其他内容相当标准(设置给定和以下链接等...)

那么,您使用什么作为浏览器抽象?韦拉特?水豚?看起来好像您有一个“删除”链接,执行这样的操作是否足够?

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 步骤来支持的。

这是您要找的吗?

I'm going to assume it's the deleting part that is messing you up as the other stuff is fairly standard (setting up givens and following links etc...)

So, what are you using as your browser abstraction? Webrat? Capybara? It appears as if you have a 'delete' link, is it sufficient to do something like this?

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

And I believe something like "should not see" is probably supported out of the box with generated webrat/capybara steps.

Is this what you're looking for?

陪你搞怪i 2024-10-11 12:47:48

我遇到了同样的问题,并研究了“我遵循“abcd””到 click_link() 的翻译,我发现有一个可选的 : 方法。所以我定义了这个:

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”作为 get”进行了尝试,并且有效,因此方法部分似乎相当灵活。

I had the same problem, and looking into the translation of 'I follow "abcd"' to click_link(), I found there's an optional :method. So I defined this:

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

and that worked... Then I decided to make it more general, not just "as delete":

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

Works great. I tried it with 'I follow "mylink" as get' too, and that worked, so the method part seems to be suitably flexible.

杀お生予夺 2024-10-11 12:47:48

根据下面布拉德的回答,我选择了:

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

Following on Brad's answer below I went with:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文