К сожалению, я думаю, вам нужно поставить тест для каждого состояния -> переход состояния, что может показаться дублированием кода.
describe Ratification do
it "should initialize to :boss" do
r = Ratification.new
r.boss?.should == true
end
it "should move from :boss to :owner to :done as it's approved" do
r = Ratification.new
r.boss?.should == true
r.approve
r.owner?.should == true
r.approve
r.done?.should == true
end
# ...
end
К счастью, я думаю, что это обычно вписывается в интеграционное тестирование. Например, чрезвычайно простой конечный автомат для платежной системы будет:
class Bill < ActiveRecord::Base
belongs_to :account
attr_protected :status_events
state_machine :status, :initial => :unpaid do
state :unpaid
state :paid
event :mark_as_paid do
transition :unpaid => :paid
end
end
end
Возможно, у вас все еще есть модульные тесты, как указано выше, но, возможно, у вас также будут интеграционные тесты, например:
describe Account do
it "should mark the most recent bill as paid" do
@account.recent_bill.unpaid?.should == true
@account.process_creditcard(@credit_card)
@account.recent_bill.paid?.should == true
end
end
Это было много ручного труда, но, надеюсь, это имеет смысл. Я также не очень привык к RSpec, так что, надеюсь, я не делал там слишком много ошибок. Если есть более элегантный способ проверить это, я еще не нашел его.