問題は、42行目あたりの匿名ステートマシンの定義にあります。
order.class.transitions.each { |attrs| transition(attrs) }
これは、遷移ガードがクラスのコンテキストではなく、匿名ステートマシンのコンテキストで評価されることを意味しますOrder
。
1つの解決策は、トランジションガードを変換することです。上記の行をこれに置き換えて、テストスイートに合格します。
order.class.transitions.each do |attrs|
if attrs[:if].is_a? Symbol
if_method = attrs[:if]
attrs[:if] = lambda { order.send( if_method ) }
end
transition(attrs)
end
完全なソリューションを得るには、すべてのタイプのトランジションガードをサポートする必要があります。StateMachine::EvalHelpers
完全なセットを探すことをお勧めします。
修正:
他の人が述べているように、テストスイートも修正する必要があります。
go_to :payment, :if => :payment_required? # Line 107
order.stub :payment_required? => true # Line 142