Please, help me. I'm confused. I know how to write state-driven behavior of model, but I don't know what should I write in specs...
My model.rb file look
class Ratification < ActiveRecord::Base
belongs_to :user
attr_protected :status_events
state_machine :status, :initial => :boss do
state :boss
state :owner
state :declarant
state :done
event :approve do
transition :boss => :owner, :owner => :done
end
event :divert do
transition [:boss, :owner] => :declarant
end
event :repeat do
transition :declarant => :boss
end
end
end
I use state_machine gem.
Please, show me the course.
The question is old, but I had the same one. Taking example from state_machine gem :
class Vehicle
state_machine :state, :initial => :parked do
event :park do
transition [:idling, :first_gear] => :parked
end
event :ignite do
transition :stalled => same, :parked => :idling
end
event :idle do
transition :first_gear => :idling
end
event :shift_up do
transition :idling => :first_gear, :first_gear => :second_gear, :second_gear => :third_gear
end
event :shift_down do
transition :third_gear => :second_gear, :second_gear => :first_gear
end
end
end
My solution was:
describe Vehicle do
before :each do
@vehicle = Factory(:vehicle)
end
describe 'states' do
describe ':parked' do
it 'should be an initial state' do
# Check for @vehicle.parked? to be true
@vehicle.should be_parked
end
it 'should change to :idling on :ignite' do
@vehicle.ignite!
@vehicle.should be_idling
end
['shift_up!', 'shift_down!'].each do |action|
it "should raise an error for #{action}" do
lambda {@job_offer.send(action)}.should raise_error
end
end
end
end
end
I was using:
The state_machine_rspec gem includes many helper methods for writing concise specs.
describe Ratification do
it { should have_states :boss, :declarant, :done, :owner }
it { should handle_events :approve, when: :boss }
it { should handle_events :approve, when: :owner }
it { should handle_events :divert, when: :boss }
it { should handle_events :divert, when: :owner }
it { should handle_events :repeat, when: :declarant }
it { should reject_events :approve, :divert, :repeat, when: :done }
it { should reject_events :approve, :divert, :repeat, when: :done }
end
These RSpec matchers will assist with the state_machine
specs from a high-level. From here, one needs to write the specs for the business cases for can_approve?
, can_divert?
, and can_repeat?
.
I have written a RSpec custom matcher. It allows to test state flow in elegant and simple way: check it out
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With