Rspec-core: Выполните одну и ту же спецификацию несколько раз с разными фильтрами

Созданный на 8 окт. 2011  ·  3Комментарии  ·  Источник: rspec/rspec-core

_Отказ от ответственности: этот запрос специально связан с выполнением приемочных тестов 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 который предоставляет эту функциональность, не стесняйтесь :).

Все 3 Комментарий

Фильтры на самом деле не предназначены для этого из коробки, но нетрудно получить поведение, которое вы просите, без внесения нами изменений в 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: здорово

Была ли эта страница полезной?
0 / 5 - 0 рейтинги