ArgumentError тестирование State Machine - PullRequest
1 голос
/ 29 июня 2019

Я использую следующие версии:

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

Я не уверен, как это работает - я знаю, как сделать параметрнеобязательно, но я не знаю, как необязательно передать аргумент.

В любом случае - тест пройден, если я добавлю параметр в свой методд определение.Но я не хочу добавлять параметр, который я не использую, просто чтобы передать свои спецификации.Как мне решить эту проблему?

...