2010-11-22 2 views
4

У меня есть следующая таблица в приложении Я разрабатываю с помощью рубина на рельсах: 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 | [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"` 

Может кто-нибудь помочь? Спасибо.

@ Брэд

Обнаружена ошибка:

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


+0

Вы можете добавить функцию/сценарий к столбу? – 2010-11-22 18:33:23

+0

Добавлен и пример того, что я хочу сделать. В основном я хочу симулировать щелчок по ссылке удаления рядом с Алисой Хантером. – 2010-11-22 18:49:52

ответ

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 

Я также insterested в RDoc Webrat, но все, что я нашел, кажется, выходит из строя.

1

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

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

Это вы что искали?

2

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

1

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

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