_Aviso de responsabilidade: Esta solicitação origina-se especificamente de testes de aceitação de JavaScript com Capybara. Embora eu possa ver casos de uso para outras situações._
Todos os meus aplicativos são codificados para que funcionem bem com o JS desativado, mas com o JS desativado, você obtém muitos recursos interessantes para tornar a experiência do usuário mais agradável. Por causa disso, do ponto de vista do usuário, as interações na maioria das coisas são idênticas; no entanto, quero testar se funciona sem e sem JS.
O que eu gostaria de poder fazer é definir algum tipo de sinalizador para dizer ao RSpec para executar a mesma especificação duas vezes com cada conjunto de filtros. Algo como:
it 'does this same thing with and without JS enabled', :run_with => [{:js => true}, {:js => false}] do
# stuff here
end
Eu sei que isso pode ser feito com exemplos compartilhados, mas o código resultante não é muito elegante.
Além disso, pode ser usado se você quiser testar sem JS (teste Rack) com JS no Firefox (Selenium) e com JS no Webkit (capivara-webkit) como este:
it 'does this same thing with and without JS enabled', :run_with => [{:js => false}, {:driver => :selenium}, {:driver => :webkit}] do
# stuff here
end
Também estou imaginando uma maneira de usar filtros personalizados para especificar as opções run_with
, de modo que não seja tão detalhado, como:
it 'does this same thing with and without JS enabled', :run_with_all_drivers => true do
# stuff here
end
Pensamentos? Eu olhei os documentos e o código e não vi uma maneira de fazer isso com filtros.
Os filtros não são realmente projetados para fazer isso fora da caixa, mas não é difícil obter o comportamento que você está pedindo sem que façamos alterações no 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
Se este for um padrão comum de que você precisa, pode criar um pequeno método DSL para ele:
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
Então você pode usar este método da seguinte forma:
describe "My integration spec" do
with_and_without_js do
it "does something with and without js" do
end
end
end
Eu acho isso muito elegante. Mudar como os filtros funcionam para fazer o que você está pedindo seria uma mudança bastante significativa que adicionaria uma carga de manutenção futura para a equipe RSpec para um recurso que eu esperaria ser raramente usado, então meu instinto é não adicionar isso ao núcleo .
Dito isso, se você deseja criar uma rspec-multi-filters
gem que forneça essa funcionalidade, fique à vontade :).
@myronmarston como de costume, era apenas minha ignorância do que o RSpec poderia fazer. Obrigado por dedicar um tempo e esclarecer. Eu acho que isso vai funcionar bem. :)
: +1: incrível
Comentários muito úteis
Os filtros não são realmente projetados para fazer isso fora da caixa, mas não é difícil obter o comportamento que você está pedindo sem que façamos alterações no RSpec:
Se este for um padrão comum de que você precisa, pode criar um pequeno método DSL para ele:
Então você pode usar este método da seguinte forma:
Eu acho isso muito elegante. Mudar como os filtros funcionam para fazer o que você está pedindo seria uma mudança bastante significativa que adicionaria uma carga de manutenção futura para a equipe RSpec para um recurso que eu esperaria ser raramente usado, então meu instinto é não adicionar isso ao núcleo .
Dito isso, se você deseja criar uma
rspec-multi-filters
gem que forneça essa funcionalidade, fique à vontade :).