Как я могу использовать несколько контекстов RSpe c в одном примере? - PullRequest
1 голос
/ 04 марта 2020

У меня есть набор контекстов с заданными предложениями before, которые я хотел бы обернуть вокруг различных примеров. Вот моя попытка:

# The "multi-context" wrapper
def with_foo_and_bar(&block)
  before { p 'hello world' }

  context 'foo' do
    before { p 'baz' }
    yield
  end

  context 'bar' do
    before { p 'qux' }
    yield
  end
end

# The example
describe do
  with_foo_and_bar do
    it 'prints some stuff' do
      # Example runs twice, but only 'hello world' is printed
    end
  end
end

В этой спецификации c я бы ожидал, что все пункты before будут выполняться и распечатывать "baz" и "qux" по одному разу и "hello world" дважды, но печатается только «привет мир» (дважды, как и ожидалось). Я чувствую, что есть какая-то проблема с игнорированием yield блоков before, но я не уверен, как настроить код, чтобы получить то, что я хочу. Буду признателен за любые предложения!

1 Ответ

1 голос
/ 04 марта 2020

Я нашел ответ, подсказанный здесь:

https://www.jorgemanrubia.com/2010/01/16/using-macros-to-create-custom-example-groups-in-rspec/

Решение заключается в следующем:

def with_foo_and_bar(&block)
  foo = context 'foo' do
    before { p 'baz' }
  end
  foo.class_eval &block

  bar = context 'bar' do
    before { p 'qux' }
  end
  bar.class_eval &block
end

describe do
  with_foo_and_bar do
    it 'prints some stuff' do
      # Prints 'baz' once and 'qux' once
    end
  end
end
...