У меня есть класс 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, он говорит, что это так.
И в будущем будет много валют для обновления, но я не хочу тестировать и заглушать каждую из них. Как я могу решить эту проблему?