2015-11-19 2 views
0

У меня есть следующий код:Как заглушить 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 для объяснения.

ответ

1

Date.today всегда возвращает новые объекты. Сначала удалите today.

Я имею в виду, что:

>> Date.today.object_id 
=> 70175652485620 
>> Date.today.object_id 
=> 70175652610440 

Итак, когда вы звоните в следующий раз today, это другой объект.

Таким образом, либо закройте Date.today, чтобы вернуть определенную дату, либо измените код, чтобы использовать что-то вроде SomeHelper.today, которое всегда будет возвращать ту же дату в тестовой среде.

+0

Я понял, что вы сказали, но я не придумал любой рабочий способ сделать это. На данный момент я попробовал 'allow (Date) .to получать (: today) .and_return (2015, 7, 19)', но это не работает. Не могли бы вы мне помочь? – SuperManEver

+0

Создайте дату: 'the_today = Date.new (Date.new (2015, 11, 19)); allow (Date) .to receive (: today) .and_return (the_today) ', а затем заглушить все, что вам нужно. –

+0

Почему мне нужно гнездо 'Date.new', как вы делаете Date.new (Date.new (2015, 11, 19))'? – SuperManEver

3

Я думаю, что timecop будет именно тем, что вам нужно.

Смежные вопросы