RSpec: как заглушить только один из нескольких вызовов одного и того же метода - PullRequest
0 голосов
/ 15 января 2019

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

class Example
  def self.foo
    { a: YAML.load_file('a.txt'),   # don't stub - let it load
      b: YAML.load_file('b.txt') }  # stub this one
  end
end

RSpec.describe Example do
  describe '.foo' do
    before do
      allow(YAML).to receive(:load_file).with('b.txt').and_return('b_data')
    end

    it 'returns correct hash' do
      expect(described_class.foo).to eq(a: 'a_data', b: 'b_data')
    end
  end
end

Тест не пройден, потому что я поставил вызов на YAML.load_file с аргументами для второго вызова ('b.txt'), а не первого, с которым он сталкивается ('a.txt'). Я думал, что сопоставление аргументов решит эту проблему, но это не так.

Failures:

  1) Example.foo returns correct hash
     Failure/Error:
       { a: YAML.load_file('a.txt'),
         b: YAML.load_file('b.txt') }

       Psych received :load_file with unexpected arguments
         expected: ("b.txt")
              got: ("a.txt")
        Please stub a default value first if message might be received with other args as well.  

Есть ли способ, позволяющий разрешить первый вызов на YAML.load_file, но только заглушить второй вызов? Как бы я это сделал?

1 Ответ

0 голосов
/ 15 января 2019

Существует опция and_call_original (см. rspec docs ).

Применительно к вашему примеру, это должно сделать то, что вы ищете:

before do
  allow(YAML).to receive(:load_file).and_call_original
  allow(YAML).to receive(:load_file).with('b.txt').and_return('b_data')
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...