Como executar um único teste RSpec?

306

Eu tenho o seguinte arquivo:

/spec/controllers/groups_controller_spec.rb

Qual comando no terminal eu uso para executar exatamente essa especificação e em qual diretório eu executo o comando?

Meu arquivo gem:

# Test ENVIRONMENT GEMS
group :development, :test do
    gem "autotest"
    gem "rspec-rails", "~> 2.4"
    gem "cucumber-rails", ">=0.3.2"
    gem "webrat", ">=0.7.2"
    gem 'factory_girl_rails'
    gem 'email_spec'
end

Arquivo de especificação:

require 'spec_helper'

describe GroupsController do
  include Devise::TestHelpers

  describe "GET yourgroups" do
    it "should be successful and return 3 items" do

      Rails.logger.info 'HAIL MARRY'

      get :yourgroups, :format => :json
      response.should be_success
      body = JSON.parse(response.body)
      body.should have(3).items # @user1 has 3 permissions to 3 groups
    end
  end
end
Um aprendiz
fonte
Você pode executar seus testes como o pacote configurável exec rspec ./spec/controllers/groups_controller_spec.rb:6, ele executa apenas este teste específico. Mais informações aqui: kolosek.com/rails-rspec-setup
Zoric
bundle exec rspec spec --helpdar-lhe-ei a resposta:
Thomas Decaux

Respostas:

15

Não sei quanto tempo isso está disponível, mas há uma configuração de Rspec para filtragem de execução - agora você pode adicioná-lo ao seu spec_helper.rb:

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

E adicione uma marca de foco ao it, contextou describepara executar apenas esse bloco:

it 'runs a test', :focus do
  ...test code
end

Documentação do RSpec:

https://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration#filter_run_when_matching-instance_method

emc
fonte
1
Isso requer alteração da infraestrutura. E lembrando de mudar de volta. Eu recomendaria não fazer isso e usar apenas os rspeccomandos para executar a especificação com o parâmetro apropriado para indicar qual é o #
Michael Durrant
482

Normalmente eu faço:

rspec ./spec/controllers/groups_controller_spec.rb:42

Onde 42representa a linha do teste que eu quero executar.

EDIT1:

Você também pode usar tags. Veja aqui .

EDIT 2:

Experimentar:

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42
apneadiving
fonte
Obrigado tentei que ele não funciona quando eu faço rake spec /spec/path...:XX eu recebo o erro /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -S bundle exec rspec ./spec/controllers/groups_controller_spec.rb ./spec/controllers/incoming_mails_controller_spec.rb ./spec/lib/mailing_job/mailingjob_find_reply_spec.rb ./spec/models/group_model_spec.rb ./spec/models/user_model_spec.rb
AnApprentice
Se eu tentar usar apenas o RSPEC, recebo este erro: "$ rspec spec / controllers / groups_controller_spec.rb: 19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 : in `setup ': Você já ativou o rspec-core 2.6.2, mas o seu Gemfile requer o rspec-core 2.6.0. Considere o uso de bundle exec. (Gem :: LoadError)"
AnApprentice
Você pode tentar "pacote exec rspec spec / controllers / groups_controller_spec.rb: 19" nesse caso
muffinista
exec pacote funcionou, mas por quê? Isso é um truque para evitar isso?
AnApprentice
11
não é um hack, garante que você use a mesma versão que você declarou em seu gemfile. No seu caso, o mero rspecfalhou porque a versão no seu sistema é mais recente que a do seu gemfile.
apneadiving
67

Com Rake:

rake spec SPEC=path/to/spec.rb

(O crédito vai para esta resposta . Vá votar nele.)

EDIT (graças a @cirosantilli): para executar um cenário específico dentro da especificação, você deve fornecer uma correspondência de padrão de expressão regular que corresponda à descrição.

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""
Grant Birchmeier
fonte
11
Esta é a resposta superior porque usa o comando 'rake spec' e não o comando 'rspec'. Isso significa que o banco de dados de teste é devidamente re-inicializado cada vez (o que não acontece se você usar 'rspec ...')
jpw
Você pode usar SPEC=path/to/spec.rb:42para executar o teste no número de linha especificado, embora pareça que todos os it_behaves_liketestes também serão executados (bug?).
mgold
61

Você pode passar uma regex para o comando spec, que executará apenas itblocos correspondentes ao nome que você fornecer.

spec path/to/my_spec.rb -e "should be the correct answer"

Atualização 2019: Rspec2 mudou do comando 'spec' para o comando 'rspec'.

Douglas F Shearer
fonte
Obrigado, tentei isso, mas ele erro com: $ rake spec spec / controllers / incoming_mails_controller_spec.rb -e "deve ser bem-sucedido e retornar 3 itens" rake abortado! (eval): 1: em `standard_rake_options': erro de compilação (eval): 1: erro de sintaxe, inesperado tIDENTIFIER, esperando $ final deve ser bem sucedida e retornar 3 itens
AnApprentice
Atualizado com as idéias reais do arquivo de especificações?
AnApprentice
Se você tiver um erro de compilação, sua especificação não é válida para ruby. Certifique-se que você não está faltando um doapós um it, contextou describedeclaração.
Douglas F Shearer
1
É "spec", não "rake spec".
Muffinista
esta deve ser a resposta correta, relativa a um número de linha está seriamente errado - qualquer qualquer caso
Eugen Mayer
27

Existem muitas opções:

rspec spec                           # All specs
rspec spec/models                    # All specs in the models directory
rspec spec/models/a_model_spec.rb    # All specs in the some_model model spec
rspec spec/models/a_model_spec.rb:nn # Run the spec that includes line 'nn'
rspec -e"text from a test"           # Runs specs that match the text
rspec spec --tag focus               # Runs specs that have :focus => true
rspec spec --tag focus:special       # Run specs that have :focus => special
rspec spec --tag focus ~skip         # Run tests except those with :focus => true
Michael Durrant
fonte
23

Meu método preferido para executar testes específicos é um pouco diferente - adicionei as linhas

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

Para o meu arquivo spec_helper.

Agora, sempre que eu quiser executar um teste específico (ou contexto ou especificação), posso simplesmente adicionar a tag "focus" a ele e executar meu teste normalmente - somente os testes focados serão executados. Se eu remover todas as tags de foco, ele run_all_when_everything_filteredinicia e executa todos os testes normalmente.

Não é tão rápido e fácil quanto as opções da linha de comando - exige que você edite o arquivo para o teste que deseja executar. Mas me dá muito mais controle, eu sinto.

GlyphGryph
fonte
Definitivamente, prefiro esse estilo, porque geralmente estou executando testes via Rubymine / intelliJ. Eu gosto desse método também porque é semelhante ao uso de fit / xit em jasmim / com gulp
wired00
9

A resposta @apneadiving é uma maneira elegante de resolver isso. No entanto, agora temos um novo método no Rspec 3.3. Podemos simplesmente executar em rspec spec/unit/baseball_spec.rb[#context:#it]vez de usar um número de linha. Retirado daqui:

O RSpec 3.3 apresenta uma nova maneira de identificar exemplos [...]

Por exemplo, este comando:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] … Executaria o 2º e o 4º exemplo ou grupo definido no 1º grupo de nível superior definido em spec / unit / baseball_spec.rb.

Portanto, em vez de fazer rspec spec/unit/baseball_spec.rb:42onde (teste na linha 42) é o primeiro teste, podemos simplesmente fazer rspec spec/unit/baseball_spec.rb[1:1]ou rspec spec/unit/baseball_spec.rb[1:1:1]dependendo de quão aninhado está o caso de teste.

Ingo
fonte
5

Nos trilhos 5,

Eu usei esse caminho para executar um único arquivo de teste (todos os testes em um arquivo)

rails test -n /TopicsControllerTest/ -v

O nome da classe pode ser usado para corresponder ao arquivo desejado TopicsControllerTest

Minha classe class TopicsControllerTest < ActionDispatch::IntegrationTest

Resultado :

insira a descrição da imagem aqui

Se você quiser, pode ajustar o regex para corresponder ao método de teste único \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v
Alupotha
fonte
4

Para o modelo, ele será executado apenas na linha número 5

bundle exec rspec spec/models/user_spec.rb:5

Para o controlador: ele será executado apenas na linha número 5

bundle exec rspec spec/controllers/users_controller_spec.rb:5

Para o modelo de sinal ou controlador, remova o número da linha acima

Para executar o caso em todos os modelos

bundle exec rspec spec/models

Para executar o caso em todos os controladores

bundle exec rspec spec/controllers

Para executar todos os casos

 bundle exec rspec 
Sandeep Kapil
fonte
3

Execute os comandos do diretório raiz do seu projeto:

# run all specs in the project's spec folder
bundle exec rspec 

# run specs nested under a directory, like controllers
bundle exec rspec spec/controllers

# run a single test file
bundle exec rspec spec/controllers/groups_controller_spec.rb

# run a test or subset of tests within a file
# e.g., if the 'it', 'describe', or 'context' block you wish to test
# starts at line 45, run:
bundle exec rspec spec/controllers/groups_controller_spec.rb:45
Allison
fonte
1

começando com rspec 2, você pode usar o seguinte:

# in spec/spec_helper.rb
RSpec.configure do |config|
  config.filter_run :focus => true
  config.run_all_when_everything_filtered = true
end

# in spec/any_spec.rb
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end
Rudi
fonte
0

Como você está em um projeto do rails 3 com o rspec 2, no diretório raiz do rails:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

definitivamente deve funcionar. cansei de digitar isso, então criei um alias para encurtar 'bundle exec rspec' para 'bersp'

'bundle exec' é para que ele carregue o ambiente exato da gema especificado no seu arquivo gema: http://gembundler.com/

Rspec2 mudou do comando 'spec' para o comando 'rspec'.

MissingHandle
fonte
0

Eu uso essa jóia de guarda para executar automaticamente meu teste. Ele executa o teste após criar ou atualizar operações no arquivo de teste.

https://github.com/guard/guard-test

ou geralmente você pode executar usando o seguinte comando

rspec spec / controllers / groups_controller_spec.rb

Rameshwar Vyevhare
fonte
0

Você pode fazer algo assim:

 rspec/spec/features/controller/spec_file_name.rb
 rspec/spec/features/controller_name.rb         #run all the specs in this controller
Prabhakar Undurthi
fonte
0

Você pode usar

 rspec spec/controllers/groups_controller_spec.rb:<line_number>

O número da linha deve ser o número da linha 'descreva' ou 'it', para que ele execute os testes presentes naquele bloco específico. em vez disso, executará todas as linhas próximas a line_number.

Além disso, você pode criar um bloco com nome personalizado e, em seguida, pode executar apenas esses blocos.

Akshay Dhobale
fonte
0

Outro erro comum é ainda ter ou atualizar um aplicativo Rails mais antigo para o Rails 5+ e colocar require 'spec_helper'no topo de cada arquivo de teste. Isso deve ser alterado para require 'rails_helper'. Se você estiver vendo um comportamento diferente entre a tarefa rake ( rake spec) e quando você executa uma única especificação ( rspec path/to/spec.rb), esse é um motivo comum

a melhor solução é

1) verifique se você está usando require 'rails_helper'na parte superior de cada um dos seus arquivos de especificação - não no estilo antigo require 'spec_helper' 2) use orake spec SPEC=path/to/spec.rb sintaxe

o estilo mais antigo que rspec path/to/spec.rbeu acho que deveria ser considerado fora de moda pela comunidade neste momento em 2020 (mas é claro que você fará com que funcione, outras considerações à parte)

Jason FB
fonte