Aqui está um exemplo de backtrace obtido da execução de um conjunto de especificações inteiro que usa grupos de especificações compartilhados
8)
RuntimeError in 'Arel Join#each iterates over the rows in any order'
/Users/apatterson/git/arel/spec/../lib/arel/algebra/relations/operations/join.rb:14:in `hash'
/Users/apatterson/git/arel/spec/../lib/arel/session.rb:38:in `[]'
/Users/apatterson/git/arel/spec/../lib/arel/session.rb:38:in `read'
/Users/apatterson/git/arel/spec/../lib/arel/algebra/relations/relation.rb:21:in `each'
/Users/apatterson/git/arel/spec/support/matchers/have_rows.rb:5:in `have_rows'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/matchers/simple_matcher.rb:16:in `call'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/matchers/simple_matcher.rb:16:in `matches?'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/expectations/handler.rb:11:in `handle_matcher'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/expectations/extensions/kernel.rb:27:in `should'
/Users/apatterson/git/arel/spec/shared/relation_spec.rb:23:
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:40:in `instance_eval'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:40:in `execute'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/timeout.rb:53:in `timeout'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_methods.rb:37:in `execute'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:214:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:212:in `each'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:212:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/example/example_group_methods.rb:103:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:23:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:22:in `each'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/example_group_runner.rb:22:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/options.rb:152:in `run_examples'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/lib/spec/runner/command_line.rb:9:in `run'
/Library/Ruby/Gems/1.8/gems/rspec-1.3.0/bin/spec:5
Existem alguns problemas aqui.
1) dado o backtrace, não tenho ideia de qual é o contexto da especificação compartilhada. Aka, onde foi incluído, em que arquivo foi incluído, etc ... Existe a descrição 'Arel Join # cada itera sobre as linhas em qualquer ordem', mas em um projeto com muitas especificações, isso é basicamente inútil para Eu.
2) Gostaria de encontrar uma maneira de executar essa única especificação isoladamente no contexto que causou a falha. Não tenho certeza de como fazer isso agora.
David, acho que posso ter uma solução para isso:
Quando "it_should_behave_like" (ou o alias) é chamado, ele define os seguintes metadados no ExampleGroup:
Nome do grupo de exemplo compartilhado.
Caminho do arquivo e número da linha da chamada do método "it_should_behave_like".
Quando um exemplo falha, RSpec verificará se esse exemplo existe no grupo de exemplo compartilhado. Em caso afirmativo, ele anexará à saída o caminho do arquivo e o número da linha (armazenados nos metadados do ExampleGroup).
O que você acha?
Que bom, vejo que os metadados já estão lá :-)
Eu mesclei o patch de @justinko (3906559d059bcdbd4d15303303c517088b038eeb), que exibe a linha que chama o grupo compartilhado, então agora sabemos o contexto em que foi executado. Isso ainda deixa em aberto o problema de executar um único exemplo compartilhado - mas isso deve ajudar pelo menos a entender quando um exemplo compartilhado falha.
Você pode executar um único exemplo em um grupo compartilhado via rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"
Sim - isso é verdade. Isso é bom o suficiente para mim. Eu vou fechar isso. @carllerche se você acha que isso não é suficiente, comente aqui e eu reabrirei.
Merda, encontrei um bug com este:
share_as :MySpecs do
let(:foo) { described_class # returns nil }
Investigando.
Eu quero descontinuar share_as. Ele gera um módulo, que você usa include
para incluir, que tem implicações muito diferentes da criação de um grupo aninhado, como fazemos agora com shared_examples_for
. WDYT?
Eu concordo totalmente em descontinuá-lo. Quando comecei a aprender RSpec, fiquei confuso por que havia shared_examples_for
e share_as
.
Costumo usar share_as
para o grupo de nível superior:
describe Model do
include MySharedSpecs
context 'it works' do
it_should_behave_like 'a working model'
Mudei para shared_examples_for
e está tudo bem. Obrigado.
Para qualquer um que pule para o fundo, quero salientar que justinko forneceu uma resposta completamente satisfatória para isso acima.
Você pode executar um único exemplo em um grupo compartilhado via rspec spec / my_spec_that_contains_the_shared_group.rb --example "hello world"
Comentários muito úteis
Você pode executar um único exemplo em um grupo compartilhado via
rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"