2016-04-11 13 views
1

Bazı DB varsayılanlarını Time (Zaman) ile ayarlamaya çalışan Rails 4 eski uygulama & ile çalışma. MySQL kullanarak.Raylar - Geçişte varsayılan süreyi ayarlama ve RSpec ile sınama

class AddDefaultsToCheckInAndCheckOut < ActiveRecord::Migration 
    def change 
    change_column_default :rooms, :check_in_time, "12:00" 
    change_column_default :rooms, :check_out_time, "09:00" 
    end 
end 

şema şimdi gösterir:

t.time "check_in_time", default: "2000-01-01 12:00:00" 
t.time "check_out_time", default: "2000-01-01 09:00:00" 

tarih bölümü emin oldum rağmen sütun type ayarlandığında gereklidir neden bana hiçbir önemi olan bir göç eklendi

Bu, Room modelinde tanımlanan bazı belirleyicilerden kaynaklanıyor olabilir:

def check_in_hours=(hours) 
    begin 
    self.check_in_time = hours.present? ? Time.utc(2001,1,1, hours, self.check_in_time.try(:min)) : nil 
    rescue ArgumentError 
    end 
end 

def check_in_mins=(minutes) 
    begin 
    if self.check_in_time.try(:hour) 
     self.check_in_time = Time.utc(2001, 1, 1, self.check_in_time.try(:hour), (minutes.present? ? minutes : 0)) 
    else 
     self.check_in_time = nil 
    end 
    rescue ArgumentError 
    end 
end 

İşimi kontrol etmek için bazı özelliklerini ekledi (room_spec.rb)

it "defaults to 12:00 check in time if not specified" do 
    expect(room.check_in_time).to eq "2000-01-01 12:00:00" 
    end 

Sonra da fabrikaya ilave (fabrikalar/rooms.rb)

check_in_time "2000-01-01 12:00:00" 
check_out_time "2000-01-01 09:00:00" 

Buradaki amaç, yazdığım taşıma tarafından oluşturulan şema varsayılanının aynasıydı.


Ancak bu teknik özellik başarısız:

1) Room defaults to 12:00 check in time if not specified 
    Failure/Error: expect(room.check_in_time).to eq "2000-01-01 12:00:00" 
     expected: "2000-01-01 12:00:00" 
     got: 2000-01-01 12:00:00.000000000 +0800 

Sorum en ilgili bu şunlardır:

  • Bu nasıl varsayılan uygulamak isteyen olmalıdır?
  • Ve nasıl test edilir?
  • Veritabanı varsayılanlarını bile test etmeli miyim?
  • Fabrikaya eklemek, testi sadece 'yüklemeye' benziyor.
+0

Her zaman UTC'yi veya saat dilimine özgü saat dilimini kullanarak kontrol edin ... emin değilseniz, beklentinin her iki tarafını da dönüştürün. –

cevap

2

"2000-01-01 12:00:00" saat dilimi belirsizdir, ancak tarih nesnesiniz için açıkça tanımlanmıştır. Muayene ile% 100 emin değilsiniz, ancak "2000-01-01 12:00:00 +0800" ile karşılaştırmak size geçen bir testi verebilir.

Bu, testin, davranışından sorumlu gerçek koddan daha karmaşık olduğu noktaya özellikle önem verdiği için, bu çok ayrıntılı bir test değildir. Bununla birlikte, eğer bu değer çok önemliyse ve testi tutmak istiyorsanız, kayan nokta hatalarını, vb. Korumak zorunda olmadığınız için, karşılaştırmanın zaman çözünürlüğünü yalnızca saat ve dakikaları veya belki de sadece birkaç saati karşılaştırmak için azaltmanızı tavsiye ederim.

+0

Teşekkürler Anthony - Bunu gerçekten test etmem gerekiyor. Şemasındaki varsayılanın açıkça tanımlandığını görebildiğimde, test genel gider perspektifinden çok daha fazla. TimeZone'da başın için teşekkürler. –

İlgili konular