Почему let (: counter) {0} возвращает nil в примере? - PullRequest
1 голос
/ 04 ноября 2019

Имеют две переменные в Rspec, обе они являются целыми числами, но в примере (в блоке before) одна из них соответствует собственному значению, другая - nil. Почему?! Никогда не слышал о таком странном поведении rspec.

пытался изменить значение 0 на 1, пытался изменить имя переменной, пытался изменить 'let' на 'let!', Но поведение не изменилось.

Код:

context 'when input contains incorrect symbols' do
      let(:counter) { 1 }
      let(:mocked_retry_count) { 5 }
      before do
        allow(described_class).to receive(:gets) {
          byebug
          counter += 1
          counter > mocked_retry_count ? 'Stop the loop' : ['$', (0..9).to_a.sample, '#', '%', '&'].sample
        }
        described_class.ask_kingdoms
      end
    end

В выводе byebug я вижу, что

   62:       let(:counter) { 1 }
   63:       let(:mocked_retry_count) { 5 }
   64:       before do
   65:         allow(described_class).to receive(:gets) {
   66:           byebug
=> 67:           counter += 1
   68:           counter > mocked_retry_count ? 'Stop the loop' : ['$', (0..9).to_a.sample, '#', '%', '&'].sample
   69:         }
   70:         described_class.ask_kingdoms
   71:       end
(byebug) counter
nil
(byebug) mocked_retry_count
5

В чем принципиальное различие между 'counter' и 'mocked_retry_count'? И как я могу получить мой счетчик в примере?

1 Ответ

7 голосов
/ 04 ноября 2019

Почему let(:counter) { 0 } возвращает ноль в примере?

Нет, это не так. counter это не то, что вы думаете. Попробуйте оценить / распечатать defined?(counter) и defined?(mocked_retry_count).

В чем принципиальная разница между 'counter' и 'mocked_retry_count'?

Вы не назначаете mocked_retry_count. Помните, let создает методы. Поэтому, когда вы пытаетесь присвоить counter, вы создаете локальную переменную counter, которая скрывает ваш метод counter (и имеет значение по умолчанию nil).

Этот пост объясняется более подробнодеталь: Почему в Ruby `a = a`` nil`?

...