_Отказ от ответственности: этот запрос специально связан с выполнением приемочных тестов JavaScript с помощью Capybara. Хотя я могу видеть варианты использования для других ситуаций.
Все мои приложения закодированы так, что они нормально работают с выключенным JS, но с включенным JS вы получите много приятных наворотов, которые сделают работу пользователя более приятной. Из-за этого, с точки зрения пользователя, взаимодействие с большинством вещей идентично; однако я хочу проверить, работает ли он как с JS, так и без него.
Я бы хотел иметь возможность установить какой-то флаг, чтобы сообщить RSpec, что нужно дважды запускать одну и ту же спецификацию с каждым набором фильтров. Что-то вроде:
it 'does this same thing with and without JS enabled', :run_with => [{:js => true}, {:js => false}] do
# stuff here
end
Я знаю, что это можно сделать с помощью общих примеров, но полученный код не очень элегантен.
Его также можно использовать, если вы хотите протестировать без JS (Rack test) с JS в Firefox (Selenium) и с JS в Webkit (capybara-webkit) следующим образом:
it 'does this same thing with and without JS enabled', :run_with => [{:js => false}, {:driver => :selenium}, {:driver => :webkit}] do
# stuff here
end
Я также представляю способ использования настраиваемых фильтров для указания параметров run_with
, чтобы он не был таким подробным, например:
it 'does this same thing with and without JS enabled', :run_with_all_drivers => true do
# stuff here
end
Мысли? Я просмотрел документы и код и не нашел способа сделать это с помощью фильтров.
Фильтры на самом деле не предназначены для этого из коробки, но нетрудно получить поведение, которое вы просите, без внесения нами изменений в RSpec:
[true, false].each do |js|
it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
# stuff here
end
end
Если это общий шаблон, который вам нужен, вы можете создать для него небольшой метод DSL:
module WithAndWithoutJS
def with_and_without_js(&block)
[true, false].each do |js|
context "with :js => #{js}", :run_with => { :js => js } do
module_eval(&block)
end
end
end
RSpec.configure { |c| c.extend self }
end
Тогда вы можете использовать этот метод так:
describe "My integration spec" do
with_and_without_js do
it "does something with and without js" do
end
end
end
Я думаю, это довольно элегантно. Изменение того, как фильтры работают, чтобы делать то, что вы просите, было бы довольно значительным изменением, которое добавило бы бремя обслуживания в будущем для команды RSpec для функции, которая, как я ожидал бы, будет редко использоваться, поэтому мой инстинкт - не добавлять это в ядро .
Тем не менее, если вы хотите создать драгоценный камень rspec-multi-filters
который предоставляет эту функциональность, не стесняйтесь :).
@myronmarston, как обычно, это было просто мое незнание того, что может делать RSpec. Спасибо, что нашли время и разъяснили. Я думаю, это хорошо сработает. :)
: +1: здорово
Самый полезный комментарий
Фильтры на самом деле не предназначены для этого из коробки, но нетрудно получить поведение, которое вы просите, без внесения нами изменений в RSpec:
Если это общий шаблон, который вам нужен, вы можете создать для него небольшой метод DSL:
Тогда вы можете использовать этот метод так:
Я думаю, это довольно элегантно. Изменение того, как фильтры работают, чтобы делать то, что вы просите, было бы довольно значительным изменением, которое добавило бы бремя обслуживания в будущем для команды RSpec для функции, которая, как я ожидал бы, будет редко использоваться, поэтому мой инстинкт - не добавлять это в ядро .
Тем не менее, если вы хотите создать драгоценный камень
rspec-multi-filters
который предоставляет эту функциональность, не стесняйтесь :).