2012-02-22 2 views
2

Я написал функцию, чтобы проверить конфигурацию моего веб-приложения по умолчанию, используя Cucumber и Capybara. Часть функции выглядела так:Обобщая тесты огурца/Capybara

And the page has a photo labeled "Device" 
And the page has a checkbox labeled "Device" 
And I check "Device" 
And I submit the form 
Then the resulting page has no photo labeled "Device" 

Это сработало отлично. Я хочу, чтобы пользователи, которые установили и настроили веб-приложение на своих серверах, смогли запустить тест, чтобы подтвердить правильность их конфигурации. И «Устройство» - это строка в файле конфигурации по умолчанию, которую пользователь может изменить. Это элемент в массиве, и они могут добавлять или удалять из массива при настройке своего экземпляра приложения.

Является ли это разумным использованием инструментов или я злоупотребляю огурцом и/или Capybara? Если это разумно, как бы я это сделал? Если это плохая идея, какие инструменты я могу использовать для этого вместо этого?

Вот как я получил его на работу. Я просто не уверен, что это лучший способ сделать это.

Для этого, чтобы работать, функция бы выглядеть следующим образом:

And the page has at least 3 photos, let us call the last one "third_photo" 

на соответствующем этапе определения, я использую XPath вытащить соответствующую строку метки для первой фотографии и назначить его к объекту Hash, хранящемуся в переменной класса.

And /^I the page has at least (\d*) photos, let us call the last one "([^\"]*)"$/ do |n, name| 
    if ! defined?(@note) 
    @note = Hash.new; 
    end 
    @note[name] = find(:xpath, '//ol[@id="menu"]/li[' +n+ ']/a').text; 
end 

Последующие определения шагов теперь могут получить доступ к значению независимо от того, что было.

Таким образом, еще одна особенность может быть:

Then I uncheck "third_item" 

И соответствующее определение шага может быть:

Then /I uncheck "([^\"]*)"/ do |item| 
    uncheck(@note[item]) 
end 

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

Похоже, я либо делаю это неправильно, либо я использую неправильный инструмент. Каков правильный способ сделать это?

ответ

0

Существует сообщение в блоге об использовании переменных экземпляра в определениях шагов в http://www.cloudspace.com/blog/2010/06/23/using-instance-variables-with-cucumber-steps/.

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

В частности, davetron5000 говорит:

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

0

Не знаю, что вы ловите после рыбалки, но вам кажется, что ваши тесты и реализация довольно тесно связаны. Возможно, это ощущение, которое у вас есть, что кажется, что вы описываете свое приложение в тестах. У меня нет хорошего ответа на ваши вопросы, просто потому, что я не «понимаю» его. Тем не менее я хотел бы попросить вас отделить ваши тесты от вашей реализации и посмотреть, есть ли там какая-либо абстракция, ожидающая их поиска.

+0

Та часть, я не чувствую себя хорошо о том, использование переменной класса, чтобы передавать значения от одного шага к другому. Похоже, я нарушаю инкапсуляцию. Но, насколько я знаю, это действительно рекомендуемый подход. – Trott

Смежные вопросы