Rspe c как определить, был ли определен блок let? - PullRequest
1 голос
/ 06 января 2020

В Rspe c я хочу использовать преимущество super() для вызова определенного блока let, если он существует, или установить новое значение, если его нет, я хочу использовать это в shared_example group, но я просто не могу найти, как это сделать.

Я пытался проверить, существует ли @some_let, я пытался проверить, принадлежит ли * 1008 супер метод kernel * или нет, и никто из них не дает ничего полезного; Я не могу получить доступ к instance_methods или instance_method, потому что Rspe c не разрешает мне, и поиск по методу rnet метода не дает ответа.

Я хочу, чтобы я мог сделать что-то вроде этого:

shared_examples 'a shared example' do
  let(:some_let) { let_exists?(:some_let) ? super() : some_new_value }
end

Есть ли такой метод, как let_exists? или что-то на этот счет?

1 Ответ

2 голосов
/ 06 января 2020

Предполагая, что вы вызываете let перед включением общих примеров, это будет работать:

shared_examples 'a shared example' do
  let(:some) { 'fallback value' } unless method_defined?(:some)
end

describe 'with let' do
  let(:some) { 'explicit value' }
  include_examples 'a shared example'

  it { expect(some).to eq('explicit value') }
end

describe 'without let' do
  include_examples 'a shared example'

  it { expect(some).to eq('fallback value') }
end

method_defined? проверяет, был ли метод с именем some уже определен в текущем контексте. Если нет, метод определен для предоставления значения по умолчанию.

Другой (обычно более простой) подход состоит в том, чтобы всегда определять значение по умолчанию и предоставлять явное значение после , включая общие примеры: (таким образом перезаписывая значение по умолчанию)

shared_examples 'a shared example' do
  let(:some) { 'default value' }
end

describe 'with let' do
  include_examples 'a shared example'   # <- order is
  let(:some) { 'explicit value' }       #    important

  it { expect(some).to eq('explicit value') }
end

describe 'without let' do
  include_examples 'a shared example'

  it { expect(some).to eq('default value') }
end
...