shmn7iii

Blog

RSpec で日付の大小比較

前提

Hoge の ends_at は started_at よりも大きい(後の日付)

※ 関係ないカラムは省略

class Hoge < ApplicationRecord validates :ends_at, comparison: { greater_than: :started_at } end
app/models/hoge.rb
require 'rails_helper' RSpec.describe Hoge, type: :model do describe 'validations' do it { expect(:started_at).to be < :ends_at } end
spec/models/hoge_spec.rb
$ rspec spec/models/hoge_spec.rb F Failures: 1) Hoge validations is expected to be < ends at Failure/Error: it { expect(:started_at).to be < (:ends_at) } expected: < :ends_at got: :started_at ...

通った
it { expect(:activated_at).to be < :ends_at } it { expect(:activated_at).to be < :expires_at }
通らなかった
it { expect(:started_at).to be < :ends_at } it { expect(:started_at).to be < :expires_at } it { expect(:starts_at).to be < :ends_at } it { expect(:starts_at).to be < :expires_at } it { expect(:title).to be < :ends_at }

仮説①

予約語?

⇒ title で通らなかったのでそんなことない

仮説②

シンボルが悪い?

⇒ 以下で通らず

it { expect(described_class.started_at).to be < described_class.ends_at } it { expect(started_at).to be < ends_at }

仮説③

これただの文字列の比較では?

$ irb >> 'activated_at' < 'ends_at' => true >> 'started_at' < 'ends_at' => false >> 'title' < 'ends_at' => false

⇒ そうかもしれん

it { expect(:A).to be < :B } ------ $ rspec spec/models/hoge_spec.rb . Finished in 0.01814 seconds (files took 8.69 seconds to load) 1 example, 0 failures

通った

it { expect(:B).to be < :A } ------ $ rspec spec/models/hoge_spec.rb F Failures: 1) Hoge validations is expected to be < A Failure/Error: it { expect(:B).to be < :A } expected: < :A got: :B ...

通らなかった

おそらくこの string operator matchers の判定になってる

結論

仮説③で正解

こうした

require 'rails_helper' RSpec.describe Hoge, type: :model do describe 'validations' do subject { instance.save! } let(:instance) { build hoge } let(:started_at) { Time.current.tomorrow } let(:ends_at) { Time.current } it { expect { subject }.not_to raise_error } end