Como executo apenas testes específicos no Rspec?

159

Eu acho que existe uma maneira de executar apenas testes com um determinado rótulo. Alguém sabe?

Nathan Long
fonte

Respostas:

186

Não é fácil encontrar a documentação, mas você pode marcar exemplos com um hash. Por exemplo.

# spec/my_spec.rb
describe SomeContext do
  it "won't run this" do
    raise "never reached"
  end

  it "will run this", :focus => true do
    1.should == 1
  end
end

$ rspec --tag focus spec/my_spec.rb

Mais informações no GitHub . (qualquer pessoa com um link melhor, por favor, informe)

(atualizar)

O RSpec agora está soberbamente documentado aqui . Veja a seção de opções --tag para detalhes.

A partir da v2.6, esse tipo de tag pode ser expresso ainda mais simplesmente incluindo a opção de configuração treat_symbols_as_metadata_keys_with_true_values, que permite:

describe "Awesome feature", :awesome do

onde :awesomeé tratado como se fosse :awesome => true.

Consulte também esta resposta para saber como configurar o RSpec para executar automaticamente testes 'focados'. Isso funciona especialmente bem com o Guard .

zetético
fonte
Portanto, você não precisa procurar, o link direto para a sugestão da zetetic está aqui (para Rspec 2.12) relishapp.com/rspec/rspec-core/v/2-12/docs/command-line/…
tir38
Adicionamos uma especificação ao nosso conjunto para garantir que o código nunca seja mesclado com o foco: true ainda no controle de origem. gist.github.com/jwg2s/7361603
jwg2s
@ jwg2s Eu uso um gancho git para bloquear confirmações :focus, o que também impede que indesejáveis ​​como 'binding.pry , console.log`, etc. entrem na base de código.
Zetetic #
1
@Otheus não, eu sou apenas um fã :) Eu realmente gosto do que eles fizeram no Relish, mas a SO acabou de lançar seu próprio recurso de documentação, para que possamos ver alguma competição.
Zetetic
1
Talvez você possa me indicar uma documentação que realmente descreve o uso e o comportamento real do rspecprograma :) Porque o documento Relish não.
Otheus
111

Você pode executar todos os testes que contêm uma sequência específica com a opção --example (ou -e) :

rspec spec/models/user_spec.rb -e "User is admin"

Eu uso esse mais.

Jan Minárik
fonte
89

No seu spec_helper.rb:

RSpec.configure do |config|
    config.filter_run focus: true
    config.run_all_when_everything_filtered = true
end

e depois nas suas especificações:

it 'can do so and so', focus: true do
    # This is the only test that will run
end

Você também pode focar testes com 'fit' ou excluir com 'xit', assim:

fit 'can do so and so' do
    # This is the only test that will run
end
Tom Chapin
fonte
1
Em rspec 3.5, que é config.filter_run_when_matchinge que poderia trabalhar apenas adicionando :focusao exemplo
Ali Ghanavatian
4
Se 'focus: true' for acidentalmente confirmado, seu IC estará passando, apesar de não executar a maioria dos testes.
Zach
67

Como alternativa, você pode passar o número da linha: rspec spec/my_spec.rb:75- o número da linha pode apontar para uma única especificação ou um bloco de contexto / descrição (executando todas as especificações nesse bloco)

Alex Lang
fonte
50

Você também pode encadear vários números de linhas junto com dois pontos:

$ rspec ./spec/models/company_spec.rb:81:82:83:103

Resultado:

Run options: include {:locations=>{"./spec/models/company_spec.rb"=>[81, 82, 83, 103]}}
Jonathon Batson
fonte
Isso é tão dourado! --️
iGbanam
28

A partir de RSpec 2.4 (eu acho) você pode preceder um fou xpara it, specify, describee context:

fit 'run only this example' do ... end
xit 'do not run this example' do ... end

http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#fit-class_method http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#xit-class_method

Certifique-se de ter config.filter_run focus: truee config.run_all_when_everything_filtered = trueno seu spec_helper.rb.

Joshua Muheim
fonte
3

Além disso, você pode executar especificações que, focus: truepor padrão,

spec / spec_helper.rb

RSpec.configure do |c|
  c.filter_run focus: true
  c.run_all_when_everything_filtered = true
end

Então simplesmente execute

$ rspec

e apenas teste focado será executado

então quando você remover focus: truetodos os testes, execute novamente

Mais informações: https://www.relishapp.com/rspec/rspec-core/v/2-6/docs/filtering/inclusion-filters

itsnikolay
fonte
Está spec/spec_helper.rbsempre incluído? Ou apenas se nenhuma opção for dada? Por que os módulos de teste possuem require 'spec_helber'e não possuem o código acima eliminam a possibilidade de executar um único teste especificando o arquivo? Não consigo encontrar nenhuma documentação sobre isso.
Otheus
1
spec_helper.rbé sempre incluído se você tiver --require spec_helperna .rspecraiz do projeto.
Kris
0

Você pode correr como rspec spec/models/user_spec.rb -e "SomeContext won't run this".

Avijit Majhi
fonte