前提
Hoge の ends_at は started_at よりも大きい(後の日付)
※ 関係ないカラムは省略
class Hoge < ApplicationRecord validates :ends_at, comparison: { greater_than: :started_at } end
require 'rails_helper' RSpec.describe Hoge, type: :model do describe 'validations' do it { expect(:started_at).to be < :ends_at } end
$ 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