Я использую следующие версии:
ruby 2.5.5
rails 5.2.3
state_machines-activerecord 0.6.0
У меня естьмодель Foo с конечным автоматом:
class Foo < ApplicationRecord
def post_activate
puts "hello from sunny post_activate"
end
state_machine :state, initial: :initial do
state :active
after_transition any => :active, :do => :post_activate
event :activate do
transition initial: :active
end
end
end
Я пытаюсь написать тест rspec, чтобы убедиться, что post_activate
вызывается после перехода в состояние: активный.
Я могу проверить нормально с консоли Rails:
2.5.5 :001 > thinger = Foo.new
=> #<Foo id: nil, state: "initial", created_at: nil, updated_at: nil>
2.5.5 :002 > thinger.activate
(0.1ms) begin transaction
Foo Create (0.4ms) INSERT INTO "foos" ("state", "created_at", "updated_at") VALUES (?, ?, ?) [["state", "active"], ["created_at", "2019-06-28 21:35:22.555917"], ["updated_at", "2019-06-28 21:35:22.555917"]]
hello from sunny post_activate
(0.7ms) commit transaction
=> true
Однако, когда я запускаю свой тест:
describe 'Foo' do
it 'should fire post_activate' do
foo = Foo.new
expect(foo).to receive(:post_activate)
foo.activate
end
end
, я получаю следующую ошибку:
1) Foo should fire post_activate
Failure/Error: foo.activate
ArgumentError:
Wrong number of arguments. Expected 0, got 1.
Интересно, что другой тест выполняется правильно без ошибок:
it 'should change the state' do
foo = Foo.new
expect{
foo.activate
}.to change {
foo.state
}.from('initial').to('active')
end
Этот тест проходит и печатает мое отладочное сообщение.
Я попытался поместить параметр в определение post_activate
:
def post_activate(arg)
puts arg
puts "hello from sunny post_activate"
end
Теперь тест пройден - и оператор put показывает, что переданный объект является StateMachines::Transition
#<StateMachines::Transition:0x00007fd5d3534228>
hello from sunny post_activate
Я не уверен, как это работает - я знаю, как сделать параметрнеобязательно, но я не знаю, как необязательно передать аргумент.
В любом случае - тест пройден, если я добавлю параметр в свой методд определение.Но я не хочу добавлять параметр, который я не использую, просто чтобы передать свои спецификации.Как мне решить эту проблему?