Rspec-core: Debe haber una forma de ejecutar especificaciones únicas en un grupo compartido de forma aislada

Creado en 20 jul. 2010  ·  10Comentarios  ·  Fuente: rspec/rspec-core

Aquí hay un ejemplo de rastreo obtenido al ejecutar un conjunto de especificaciones completo que usa grupos de especificaciones compartidos

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

Aquí hay algunos problemas.

1) dado el rastreo, no tengo idea de cuál es el contexto de la especificación compartida. Aka, dónde se incluyó, en qué archivo se incluyó, etc. Existe la descripción 'Arel Join # cada itera sobre las filas en cualquier orden', pero en un proyecto con muchas especificaciones, eso es básicamente inútil para yo.

2) Me gustaría una forma de ejecutar esa única especificación de forma aislada en el contexto que provocó que fallara. No estoy seguro de cómo hacer eso en este momento.

Comentario más útil

Puede ejecutar un solo ejemplo en un grupo compartido a través de rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"

Todos 10 comentarios

David, creo que podría tener una solución para esto:

Cuando se llama a "it_should_behave_like" (o el alias), establece los siguientes metadatos en ExampleGroup:

Nombre del grupo de ejemplo compartido.
Ruta del archivo y número de línea de la llamada al método "it_should_behave_like".

Cuando un ejemplo falla, RSpec verificará si ese ejemplo existe en el grupo de ejemplos compartidos. Si lo hace, agregará a la salida la ruta del archivo y el número de línea (almacenados en los metadatos de ExampleGroup).

¿Qué piensas?

Oh, bueno, veo que los metadatos ya están ahí :-)

Fusioné el parche de @justinko (3906559d059bcdbd4d15303303c517088b038eeb), que muestra la línea que llama al grupo compartido, por lo que ahora sabemos el contexto en el que se ejecutó. Eso todavía deja abierto el problema de ejecutar un solo ejemplo compartido, pero esto debería ayudar al menos a comprender cuándo falla un ejemplo compartido.

Puede ejecutar un solo ejemplo en un grupo compartido a través de rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"

Sí, eso es cierto. Eso es suficiente para mí. Voy a cerrar esto. @carllerche si cree que esto no es suficiente, comente aquí y lo reabriré.

Mierda, encontré un error con esto:

share_as :MySpecs do
  let(:foo) { described_class # returns nil }

Investigando.

Quiero desaprobar share_as. Genera un módulo, que luego usa include para incluir, que tiene implicaciones muy diferentes a las de crear un grupo anidado, como lo hacemos ahora con shared_examples_for . WDYT?

Estoy completamente de acuerdo con desaprobarlo. Cuando comencé a aprender RSpec, estaba confundido por qué había shared_examples_for y share_as .

Tiendo a usar share_as para el grupo de nivel superior:

describe Model do
  include MySharedSpecs

  context 'it works' do
    it_should_behave_like 'a working model'

Cambié a shared_examples_for y todo está bien. Gracias.

Para cualquiera que vaya al final, quiero señalar que justinko proporcionó una respuesta completamente satisfactoria a lo anterior.

Puede ejecutar un solo ejemplo en un grupo compartido a través de rspec spec / my_spec_that_contains_the_shared_group.rb --example "hello world"

¿Fue útil esta página
0 / 5 - 0 calificaciones