Ответ 1
Date.today.should be_between(Date.today - 1.day, Date.today + 1.day)
Как проверить дату, чтобы увидеть, существует ли она между двумя датами? Я знаю, что могу сделать два сравнения больше и меньше, но мне нужен метод RSpec, чтобы проверить "совпадение" даты.
Например:
it "is between the time range" do
expect(Date.now).to be_between(Date.yesterday, Date.tomorrow)
end
Я пробовал expect(range).to cover(subject)
, но не повезло.
Date.today.should be_between(Date.today - 1.day, Date.today + 1.day)
Оба синтаксиса, которые вы написали, соответствуют 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.
Я сам не пробовал, но согласно this, вы должны использовать его несколько иначе:
it "is between the time range" do
(Date.yesterday..Date.tomorrow).should cover(Date.now)
end
Вам нужно определить совпадение, проверьте 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