Rspec-core: Deve haver uma maneira de executar especificações únicas em um grupo compartilhado de forma isolada

Criado em 20 jul. 2010  ·  10Comentários  ·  Fonte: rspec/rspec-core

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.

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"

Todos 10 comentários

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"

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