Dưới đây là định nghĩa lớp hiện tại của tôi và spec:State Machine, Model validations và RSpec
class Event < ActiveRecord::Base
# ...
state_machine :initial => :not_started do
event :game_started do
transition :not_started => :in_progress
end
event :game_ended do
transition :in_progress => :final
end
event :game_postponed do
transition [:not_started, :in_progress] => :postponed
end
state :not_started, :in_progress, :postponed do
validate :end_time_before_final
end
end
def end_time_before_final
return if end_time.blank?
errors.add :end_time, "must be nil until event is final" if end_time.present?
end
end
describe Event do
context 'not started, in progress or postponed' do
describe '.end_time_before_final' do
['not_started', 'in_progress', 'postponed'].each do |state|
it 'should not allow end_time to be present' do
event = Event.new(state: state, end_time: Time.now.utc)
event.valid?
event.errors[:end_time].size.should == 1
event.errors[:end_time].should == ['must be nil until event is final']
end
end
end
end
end
Khi tôi chạy spec, tôi nhận được hai thất bại và một thành công. Tôi không biết tại sao. Đối với hai trạng thái, câu lệnh return if end_time.blank?
trong phương thức end_time_before_final
đánh giá là đúng khi nó sai mỗi lần. 'hoãn' là trạng thái duy nhất có vẻ như đã trôi qua. Bất kỳ ý tưởng nào về những gì có thể xảy ra ở đây?
'before_transition: trên =>: game_ended' dường như không đầy đủ – apneadiving
Are các đối tượng có giá trị trong thông số kỹ thuật không bạn? – apneadiving
Đã xóa before_transition. Hai trong số các đối tượng hợp lệ cho: end_time và một đối tượng hợp lệ cho: end_time. – keruilin