2013-06-19 58 views
12

Làm cách nào để kiểm tra ngày để xem ngày đó có nằm trong khoảng hai ngày không? Tôi biết tôi có thể làm hai so sánh lớn hơn và ít hơn so với tôi nhưng tôi muốn một phương pháp RSpec để kiểm tra "betweeness" của ngày.RSpec - Ngày phải nằm trong khoảng từ hai ngày

Ví dụ:

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

tôi đã cố gắng expect(range).to cover(subject) nhưng không có may mắn.

Trả lời

20

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

+1

Công trình này hoàn hảo. Tôi ngạc nhiên vì tôi không thể tìm thấy bất kỳ tài liệu nào cho nó. Thậm chí không cần phải xác định nó. –

+12

Ưu tiên 'be_within (1.day) .of (Date.today)'. –

2

Tôi không thử nó bản thân mình, nhưng theo this bạn nên sử dụng nó một chút khác nhau:

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

Tôi lưu ý trong câu hỏi rằng tôi đã thử điều đó và tôi không có may mắn. Tôi đoán bạn đã bỏ lỡ nó. –

+0

Ồ đúng, tôi nghĩ có sự khác biệt giữa 'mong đợi' và' nên'. Xin lỗi. Hãy xem câu trả lời của @ spullen. – Amir

+0

Không có nhiều khác biệt. Mặc dù giải pháp này có thể hoạt động, tôi không thực sự thích cách so sánh với ngày/giờ. –

1

Bạn phải xác định một khớp, kiểm tra https://github.com/dchelimsky/rspec/wiki/Custom-Matchers

Nó có thể là

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

Nó cho phép bạn

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

Giải pháp tuyệt vời nhưng có vẻ như RSpec đã be_between đã được xác định (theo ứng dụng của tôi). –

8

Cả hai cú pháp bạn đã viết là chính xác 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 

Nếu bạn không sử dụng Rails bạn sẽ không phải Date::yesterday hay Date::tomorrow xác định. Bạn sẽ cần phải điều chỉnh theo cách thủ công:

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

Phiên bản đầu tiên hoạt động do RSpec được xây dựng trong predicate matcher. Trình so khớp này hiểu các phương thức được xác định trên các đối tượng và các đại biểu cho chúng cũng như phiên bản ? có thể có. Đối với Date, biến vị ngữ Date#between? đến từ bao gồm Comparable (xem liên kết).

Phiên bản thứ hai hoạt động vì RSpec xác định đối sánh cover.

Các vấn đề liên quan