2013-06-19 54 views
12

日付をテストして2つの日付の間にあるかどうかを確認するにはどうすればよいですか?私は2つ以上の大小比較を行うことができますが、RSpecメソッドで日付の「中間」を確認したいと思います。例えばRSpec - 日付は2つの日付の間である必要があります

it "is between the time range" do 
    expect(Date.now).to be_between(Date.yesterday, Date.tomorrow) 
end 

私はexpect(range).to cover(subject)が、運を試してみました。

答えて

20

Date.today.should be_between(Date.today - 1.day, Date.today + 1.day)

+1

これは完璧に動作します。私はそれのためのドキュメントを見つけることができなかったことに驚いています。それを定義する必要はありません。 –

+12

「be_within(1.day).of(Date.today)」を推奨します。 –

2

私はそれを自分自身を試してみませんでしたが、thisに応じてあなたは少し違っそれを使用する必要があります、あなたはマッチャーを定義する必要が

it "is between the time range" do  
    (Date.yesterday..Date.tomorrow).should cover(Date.now) 
end 
+0

私はすでにそれを試したことがあり、私は運がなかったという質問に留意しました。私はあなたがそれを逃したと思います。 –

+0

ああ、私は「期待」と「はず」の違いがあると思った。謝罪。 @ spullenの答えをチェックしてください。 – Amir

+0

大きな違いはありません。この解決策はうまくいくかもしれませんが、私は日付/時刻との比較をどのように行うのが本当に好きではありません。 –

1

https://github.com/dchelimsky/rspec/wiki/Custom-Matchers

Itをチェック可能であれば

RSpec::Matchers.define :be_between do |expected| 
    match do |actual| 
    actual[:bottom] <= expected && actual[:top] >= expected 
    end 
end 

それはあなた

it "is between the time range" do 
    expect(Date.now).to be_between(:bottom => Date.yesterday, :top => Date.tomorrow) 
end 
+0

素晴らしいソリューションですが、私のアプリケーションによると、RSpecが既に定義されているようです。 –

8

することができますあなたが書いた構文の両方がRSpecの正しいです:

it 'is between the time range' do 
    expect(Date.today).to be_between(Date.yesterday, Date.tomorrow) 
end 

it 'is between the time range' do 
    expect(Date.yesterday..Date.tomorrow).to cover Date.today 
end 

あなたがDate::yesterdayDate::tomorrow定義されていませんRailsのを使用していない場合。あなたはそれを手動で調整する必要があります:

it 'is between the time range' do 
    expect(Date.today).to be_between(Date.today - 1, Date.today + 1) 
end 

最初のバージョンはRSpecののpredicate matcherに建てによる動作します。このマッチャーは、オブジェクトに定義されているメソッドを理解し、それらに代わって、?というバージョンも可能です。 Dateについては、述語Date#between?は、Comparable(リンクを参照)が含まれています。

RSpecがcoverマッチャーを定義しているため、2番目のバージョンが機能します。

関連する問題