Изучите один конкретный звонок и проигнорируйте остальные - PullRequest
1 голос
/ 21 ноября 2011

У меня есть класс Currency и я хочу обновить его курсы. Ниже приведена спецификация класса обновления, который я планирую написать:

describe WebCrawlers::Currency::FeedParser do
  let(:gbp){ double('GBP').as_null_object }
  let(:usd){ double('USD').as_null_object }
  describe '#perform' do
    before do
      Currency.stub(:find_by_name).with('GBP').and_return( gbp )
      Currency.stub(:find_by_name).with('USD').and_return( usd )
    end

    it 'should update GBP rate' do
      gbp.should_receive(:update_attributes).with(rate_to_usd:0.63114)
      subject.perform
    end

    it 'should not update USD rate' do
      usd.should_not_receive(:update_attributes)
      subject.perform
    end
  end
end

и это работает, если я обновлю GBP только в моем текущем классе:

class WebCrawlers::Currency::FeedParser
  def perform
    Currency.find_by_name('GBP').update_attributes(rate_to_usd: 0.63114)
  end
end

Однако, как только я начинаю обновлять другие валюты, такие как 'CAD', Rspec жалуется

   <Currency> received :find_by_name with unexpected arguments
     expected: ("USD")
          got: ("CAD")

Почему это так? Вместо того, чтобы НЕ ожидать USD, он говорит, что это так.

И в будущем будет много валют для обновления, но я не хочу тестировать и заглушать каждую из них. Как я могу решить эту проблему?

...