Rspec-core: Должен быть способ запускать отдельные спецификации в общей группе изолированно

Созданный на 20 июл. 2010  ·  10Комментарии  ·  Источник: rspec/rspec-core

Вот пример обратной трассировки, полученной при запуске всего набора спецификаций, в котором используются общие группы спецификаций.

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

Здесь есть несколько проблем.

1) учитывая обратную трассировку, я понятия не имею, каков контекст общей спецификации. Ака, где он был включен, в какой файл он был включен и т. Д. Есть описание «Arel Join # each итерация по строкам в любом порядке», но в проекте с большим количеством спецификаций это в основном бесполезно для меня.

2) Мне нужен способ запустить эту единственную спецификацию изолированно в контексте, который привел к ее сбою. Я не знаю, как это сделать прямо сейчас.

Самый полезный комментарий

Вы можете запустить один пример в общей группе через rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"

Все 10 Комментарий

Дэвид, я думаю, у меня есть решение для этого:

Когда вызывается it_should_behave_like (или псевдоним), он устанавливает следующие метаданные в ExampleGroup:

Имя группы общих примеров.
Путь к файлу и номер строки вызова метода it_should_behave_like.

Когда пример терпит неудачу, RSpec проверяет, существует ли этот пример в общей группе примеров. Если это так, он добавит к выходным данным путь к файлу и номер строки (хранится в метаданных ExampleGroup).

Что вы думаете?

О, хорошо, я вижу, что метаданные уже есть :-)

Я слился @justinko патч «s (3906559d059bcdbd4d15303303c517088b038eeb), который отображает строки , которая вызывает общую группу, так что мы теперь знаем , контекст , в котором он был запущен. Это по-прежнему оставляет открытой проблему запуска единственного общего примера, но это должно помочь, по крайней мере, понять, когда общий пример терпит неудачу.

Вы можете запустить один пример в общей группе через rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"

Ага - это правда. Для меня этого достаточно. Я закрою это. @carllerche, если вы думаете, что этого недостаточно, прокомментируйте здесь, и я снова открою это.

Дерьмо, нашел ошибку вот в чем:

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

Расследование.

Я хочу отказаться от share_as. Он генерирует модуль, который вы затем используете для включения include , что имеет совсем другие последствия от создания вложенной группы, как мы это делаем сейчас с shared_examples_for . WDYT?

Я полностью согласен с его осуждением. Когда я впервые начал изучать RSpec, я был сбит с толку, почему там есть shared_examples_for и share_as .

Я обычно использую share_as для группы верхнего уровня:

describe Model do
  include MySharedSpecs

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

Я перешел на shared_examples_for и все хорошо. Спасибо.

Для всех, кто перескакивает вниз, я хочу указать, что Джастинко дал вполне удовлетворительный ответ на этот вопрос выше.

Вы можете запустить один пример в общей группе через rspec spec / my_spec_that_contains_the_shared_group.rb --example "hello world"

Была ли эта страница полезной?
0 / 5 - 0 рейтинги