У меня есть следующий код:Как заглушить Date.today.strftime в rspec 3?
def when_to_change
year, month = Date.today.strftime("%Y %m").split(' ').map {|v| v.to_i}
if month < 9
year + 2
else
year + 3
end
end
И я пытаюсь незавершенным его в моей спецификации следующим образом:
it 'when current month at the of a year' do
allow(Date.today).to receive(:strftime).with('%Y %m').and_return('2015 10')
expect(@car.when_to_change).to eq(2018)
end
it 'when current month earlier than september' do
allow(Date.today).to receive(:strftime).with('%Y %m').and_return('2015 07')
expect(@car.when_to_change).to eq(2017)
end
Когда я пытаюсь запустить спецификации это не выглядит таким образом. Что я делаю не так?
Я использую RSpec v3.3.2
ANSWER
Так как Date.today
возвращает новый объект каждый метод вызова, это может быть сделано следующим образом:
it 'when current month earlier than september' do
allow(Date).to receive(:today).and_return(Date.new(2015, 7, 19))
expect(@car.when_to_change).to eq(2017)
end
спасибо @DmitrySokurenko для объяснения.
Я понял, что вы сказали, но я не придумал любой рабочий способ сделать это. На данный момент я попробовал 'allow (Date) .to получать (: today) .and_return (2015, 7, 19)', но это не работает. Не могли бы вы мне помочь? – SuperManEver
Создайте дату: 'the_today = Date.new (Date.new (2015, 11, 19)); allow (Date) .to receive (: today) .and_return (the_today) ', а затем заглушить все, что вам нужно. –
Почему мне нужно гнездо 'Date.new', как вы делаете Date.new (Date.new (2015, 11, 19))'? – SuperManEver