Огурец: выбор элемента из таблицы для удаления или добавления - PullRequest
4 голосов
/ 22 ноября 2010

У меня есть следующая таблица в приложении, которое я разрабатываю с использованием ruby ​​на рельсах: alt text

Я хочу создать тест в огурце, где я выбираю пользователя из таблицы и удаляю его или редактирую.

Я не знаю, каково определение шага для этого.

Я хотел бы иметь возможность сделать что-то вроде:

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


Ответы [ 5 ]

2 голосов
/ 26 ноября 2010

После долгих поисков и незначительного рефакторинга мне удалось решить проблему.

Я использовал следующий шаг:

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

Я также заинтересован в RDoc Вебрата, но всеЯ считаю, что вышло из строя.

2 голосов
/ 23 декабря 2010

У меня есть устаревшее приложение, которое не очень подходит в отношении полезных идентификаторов ссылок или даже классов (т.е. 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-приложения.

1 голос
/ 14 марта 2011

У меня была та же проблема, и, глядя на перевод «я следую« 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 »как получить», и это сработало, поэтому методическая часть кажется достаточно гибкой.

1 голос
/ 22 ноября 2010

Я собираюсь предположить, что это часть удаления, которая запутывает вас, так как другие вещи довольно стандартны (настройка ссылок и переходов по ссылкам и т.д. ...)

Итак, что вы используете в качестве абстракции браузера? 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

И я считаю, что что-то вроде "не должен видеть", вероятно, поддерживается из коробки с созданными шагами вебрат / капибара.

Это то, что вы ищете?

0 голосов
/ 01 октября 2011

В ответ на ответ Брэда ниже я пошел с:

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
...