Rspec-core: Execute a mesma especificação várias vezes com filtros diferentes

Criado em 8 out. 2011  ·  3Comentários  ·  Fonte: rspec/rspec-core

_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.

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:

[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 :).

Todos 3 comentários

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

Esta página foi útil?
0 / 5 - 0 avaliações