RSpec - дата должна быть между двумя датами

Как проверить дату, чтобы увидеть, существует ли она между двумя датами? Я знаю, что могу сделать два сравнения больше и меньше, но мне нужен метод RSpec, чтобы проверить "совпадение" даты.

Например:

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

Я пробовал expect(range).to cover(subject), но не повезло.

Ответ 1

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

Ответ 2

Оба синтаксиса, которые вы написали, соответствуют 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

Если вы не используете Rails, у вас не будет Date::yesterday или Date::tomorrow. Вам нужно будет вручную настроить его:

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

Первая версия работает из-за RSpec, встроенного в предикат-совместитель. Этот помощник понимает методы, определяемые на объектах, и делегирует их, а также возможную версию ?. Для Date предикат Date#between? происходит от включения Comparable (см. Ссылку).

Вторая версия работает, потому что RSpec определяет cover.

Ответ 3

Я сам не пробовал, но согласно this, вы должны использовать его несколько иначе:

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

Ответ 4

Вам нужно определить совпадение, проверьте https://github.com/dchelimsky/rspec/wiki/Custom-Matchers

Это может быть

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