Почему rspec имеет разницу в один день в рельсах 3.1.0? - PullRequest
3 голосов
/ 19 февраля 2012

В rspec мы хотели бы проверить, обновлялось ли поле даты обновлением в контроллере счетов.Вот код:

it "should have corp head id and approve date" do
  cust = Factory(:customer)
  u = Factory(:user)
  rfq = Factory(:rfq, :sales_id => u.id, :customer_id => cust.id, :sales_id => u.id)
  q = Factory(:quote, :rfq_id => rfq.id) 
  i = Factory(:invoice, :quote_id => q.id, :approved_by_corp_head => nil )       
  session[:corp_head] = true
  session[:user_id] = u.id     
  get 'update', :id => i.id, :quote_id => q.id, :invoice => {:paid_out => true, :approved_by_corp_head => true}
  i.reload.corp_head_id.should == u.id
  i.reload.approve_date_corp_head.strftime("%Y/%m/%d").should == Time.now.strftime("%Y/%m/%d")
end

В контроллере счетов есть строка для записи Time.now:

    invoice.approve_date_corp_head = Time.now

Странно, что иногда строка i.reload.approve_date_corp_head.strftime("%Y/%m/%d").should == Time.now.strftime("%Y/%m/%d") не может сказатьчто между датами есть разница в один день.Кажется, что линия потерпит неудачу, когда мы запустим rspec поздно ночью (хотя до 12:00).Мы не видели сбоев рано утром.

Кто-нибудь имеет представление об этом странном поведении?Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 19 февраля 2012

Измените ожидание в спецификации на

i.reload.approve_date_corp_head.strftime("%Y/%m/%d").should == Time.now.utc.strftime("%Y/%m/%d")

Я бы также повторил рекомендацию Шона использовать TimeCop

3 голосов
/ 19 февраля 2012

Во-первых, я бы порекомендовал вам убедиться, что все время, с которыми вы тестируете, находятся в UTC.Таким образом, он останавливает любые различия часовых поясов, особенно если вы находитесь в часовом поясе дальше от GMT и это либо утро, либо вечер.

Во-вторых, я бы рекомендовал использовать TimeCop для остановки времени,таким образом, если вы засыпаете непосредственно перед шагом .should, он все равно даст правильный ответ, если вы пробегаете единицу времени.

...