7

私は Rails と Rspec に少し慣れていないため、モデルで日時の検証が正しいことをテストする方法がわかりません。開始時刻と終了時刻を持つモデル イベントを作成しましたが、開始時刻を過去にすることはできず、終了時刻は開始時刻より後にする必要があるなど、いくつかの重要な条件があります。

これらの検証を確実にするために、ValidatesTimeliness https://github.com/adzap/validates_timelinessを使用しています

私のモデルは次のとおりです。

class Event < ActiveRecord::Base
  ...

  validates_datetime :start_date,
    :after => :now,
    :after_message => "Event cannot start in the past"

  validates_datetime :end_date,
    :after => :start_date,
    :after_message => "End time cannot be before start time"
end

私のRSpecテストでは、次のものがあります。

describe Event do
  let(:event) { FactoryGirl.build :event }
  subject { event }

  context "when start_date is before the current time" do
    it {should_not allow_value(1.day.ago).
        for(:start_date)}
  end

  context "when end_date is before or on start date" do
    it {should_not allow_value(event.start_date - 1.day).
        for(:end_date)}

    it {should_not allow_value(event.start_date).
        for(:end_date)}
  end

  context "when the end_date is after the start_date" do
    it {should allow_value(event.start_date + 1.day).
        for(:end_date)}
  end
end

ただし、これは、開始日が正確な日時より前でなければならないことを実際にテストするものではありません。たとえば、モデル:todayの代わりに誤って使用した場合:now、これらのテストもパスします。

以前は RSpec マッチャーvalidate_date( http://www.railslodge.com/plugins/1160-validates-timeliness ) があったことをオンラインで読みましたが、これはまさに私が探していたものですが、私が知る限り、削除されました。

私の質問は、テストを改善するにはどうすればよいかということです。それに応じて成功/失敗を保証するために、最小の時間 (つまり、ミリ秒) を試行するテストを追加する必要がありますか、それともより良い方法がありますか?

前もって感謝します!

4

2 に答える 2

1

あなたはvalid?と働くことができますerrors.messages

  • あなたのandEvent以外の検証に合格する を構築しますstart_dateend_date
  • start_dateandend_date正しい順序で設定し、それevent.valid?true
  • start_dateandend_date間違った順序で設定し、そうではなく、正しい検証エラーvalid?が含まれていることを主張します。event.errors.messages(注: をevent.valid?チェックする前に呼び出す必要がありますevent.errors.messages。そうしないと、空になります)

valid?との例errors.messages:

 user = User.new
 user.errors.messages #=> {} # no messages, since validations never ran
 user.valid? # => false
 user.errors.messages #=> {:email=>["can't be blank"]}

 user.email = "foo@bar.com"
 user.valid? #=> true
 user.errors.messages #=> {}
于 2012-11-03T04:47:43.423 に答える
1

これを試して

validates_date :end_time, :after => [:start_time, Proc.new {1.day.from_now_to_date}]
validates_date :start_time, :after => Time.now
于 2012-11-24T00:33:30.360 に答える