Вот пример обратной трассировки, полученной при запуске всего набора спецификаций, в котором используются общие группы спецификаций.
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) Мне нужен способ запустить эту единственную спецификацию изолированно в контексте, который привел к ее сбою. Я не знаю, как это сделать прямо сейчас.
Дэвид, я думаю, у меня есть решение для этого:
Когда вызывается 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"
Самый полезный комментарий
Вы можете запустить один пример в общей группе через
rspec spec/my_spec_that_contains_the_shared_group.rb --example "hello world"