У меня есть объект, который сохраняет модель и запускает фоновое задание.Проверьте последовательность сообщений, отправленных на разные объекты/классы
Class UseCase
...
def self.perform
@account.save
BackgroundJob.perform_later(@account.id)
end
end
В моей спецификации я хотел бы отдельно протестировать, что оба сообщения отправляются.
Я начал с чем-то вроде
it 'saves the account' do
expect_any_instance_of(Account).to receive(:save)
UseCase.perform(account)
end
И это работало хорошо, когда я был просто сохранение счета в perform
. Но когда я добавил фоновую работу, спецификация больше не проходит, так как теперь Couldn't find Account without an ID
.
Как я могу проверить (в RSped 3.5) отдельно, что оба сообщения отправлены?
UPDATE
it 'runs the job' do
expect(BackgroundJob).to receive(:perform_later).with(instance_of(Fixnum))
UseCase.perform(account)
end
проходит, так что я предполагаю, что счет правильно сохранен.
Однако, когда я пытаюсь осмотреть @account
def self.perform
@account.save
byebug
BackgroundJob.perform_later(@account.id)
end
В 'сохраняет счет', я получаю
(byebug) @account
#<Account id: nil, full_name: "john doe" ...>
В 'запускает работу', я получаю
(byebug) @account
#<Account id: 1, full_name: "john doe" ...>
Ожидание составляет @account
a test double, поэтому в первом spec задание не может получить идентификатор.
Благодаря
У вас есть спецификация, которая проверяет, что '@ account.save' фактически возвращает' true'? Я думаю, '@account.save' возвращает 'false', иначе учетная запись недействительна, не была сохранена и, следовательно, не имеет присвоенного' id'. – spickermann
Я верю @spickermann правильно. Я добавил ответ, чтобы объяснить разницу между 'save!' И 'save'. Надеюсь, это поможет вам –