Como fazer com que o rspec-2 forneça o rastreamento completo associado a uma falha de teste?

96

No momento, se eu executar meu conjunto de testes usando rake spec, recebo um erro:

1) SegmentsController GET 'index' deve funcionar
   Falha / erro: obter 'índice'
   método indefinido `locale 'para #
   # ./spec/controllers/segments_controller_spec.rb:14:
      em `bloco (3 níveis) em '

Isso é normal, pois tenho um erro :)

O problema é que o rastreamento não ajuda muito. Eu sei que invadiu a segments_controller_spec.rblinha 14, mas é aqui que chamo o teste:

### segments_controller_spec.rb:14
get 'index'

Eu preferiria ter a quebra de linha real e o rastreamento completo, não a parte na pasta de especificações.

Correr com --tracenão ajuda.

marcgg
fonte
2
Verifique spin.atomicobject.com/2010/12/28/rspec-backtrace-filtering Há uma maneira de alterar a filtragem de backtrace RSpec padrão
Bohdan,

Respostas:

244

Você deve executar o rspec com a -bopção de ver os rastreamentos completos

solnic
fonte
9
Eu não entendi, nem esta nem a resposta aceita fornecem um retrocesso além do seu arquivo de especificações. Ou não funciona apenas para mim o_O
janko-m
e fwiw se você usar rspec com spork e guard, você pode criar um arquivo .rspec e adicionar -b a ele para obter a saída ao executar seu conjunto de testes
shicholas
Esta é de fato a resposta correta - você não precisa do backtrace completo (que inclui coisas como rails e rspec e outras joias) quase todo o tempo - a única vez que você precisa é para depurar ou entender algo causado pela joia em si. Portanto, siga os padrões de limpeza de backtrace padrão e use -b nos casos estranhos quando precisar.
Asfand Qazi
Ele não mostrou informações de rastreamento de pilha sobre o erro em si. Em vez disso, mostrou o rastreamento de pilha da gem rspec
Aleksandrus
Funciona para RSpec 3 também
Koen.
29

Outra alternativa (mais fácil) é editar o .rspecarquivo e adicionar a backtraceopção. Deve ser parecido com isto:

--colour
--backtrace

Isso lhe dará o backtrace completo. Espero que isto ajude.

nathanvda
fonte
Sim! isso é exatamente o que eu precisava. rastreamento de pilha para o erro real, não para a pilha de especificações.
DiegoSalazar
Eu acredito que a grafia apropriada é color. Eu acho que se você soletrar colouruma piada do Monty Python pode aparecer
WattsInABox
2
Apropriado se você é da América. No Reino Unido, eles escrevem em cores, e o pessoal da rspec é tão gentil em permitir os dois;)
nathanvda
2
Isso é uma chave no capô!
Eggmatters de
3

Isso também funcionará:

# rails_helper.rb
RSpec.configure do |config|
  config.full_backtrace = true
end
Maria v
fonte
2

Outra abordagem é limpar todos os padrões de exclusão de backtrace em spec_helper.rb. Eu gosto desta solução mais como eu sou capaz de manter todas as configurações RSpec em um lugar e se livrar .rspec fileou explícita --backtraceno .travis.yml.

# spec_helper.rb
RSpec.configure do |config|
  config.backtrace_exclusion_patterns = []
end
Nowaker
fonte
Não parece ter essa opção no rspec 2.x.
Michael Yagudaev
1

Não sei como fazer com que o erro do controlador apareça no rspec. Às vezes ele aparece, mas não sei quais as condições que fazem com que ele apareça. Esta é uma maneira de ver o erro rapidamente:

Abra outra sessão de terminal e execute:

tail -f log/test.log

Em seguida, volte para a sessão do terminal e execute apenas a especificação que apresentou o erro:

bin/rspec -b spec/requests/posts/index_spec.rb

Volte para o final do log e você verá o erro, esperançosamente sem muitas outras coisas ao redor (porque você executou o teste com falha sozinho).

Benjamin Atkin
fonte
0

Mais uma opção quando tudo mais falha é apenas adicionar um bloco de resgate e imprimir a pilha, tentar ou adicionar uma instrução de ligação de pry lá e usar show-stack.

rescue Exception => e
  puts ""
  puts e.backtrace
  puts ""
Michael Yagudaev
fonte
Às vezes, essa é a melhor opção. Apenas certifique-se de removê-lo assim que começar a funcionar. Deve envolver o local onde você espera que o erro esteja. Talvez coloque o bloco begine rescuecomo a instrução externa do método de ação do controlador. Ou use rescue_from.
Benjamin Atkin
1
@bat sim, esta é uma tentativa de último recurso e, como @bat disse, precisa ser removida assim que você descobrir. Lembre-se sempre de fazer o seu git diffantes de cometer para salvar o seu bacon.
Michael Yagudaev