Тестирование операции обновления в RSpec, оценивается как true, но тест завершается неудачно?

#ruby-on-rails #ruby #rspec

#рубин на рельсах #рубин #rspec

Вопрос:

У меня есть этот тест:

 it "saves the notification id in the referral for future reference" do  expect { subject.perform(*args) }  .to change(referral, :notification_id).from(nil).to(customer_notification_delivery.id) end  

И код, который он запускает сверху, это:

 if notification.present?  referral.update(friend_customer_notification_delivery_id: notification.id) end  

Я добавил несколько отладочных сообщений, чтобы проверить их после запуска теста, чтобы убедиться, что это условие выполняется, и код выполняется, и я получил true для обоих

 p notification.present?  p referral.update(friend_customer_notification_delivery_id: customer_notification_delivery.id)  

Чего-нибудь мне не хватает? Почему обновление возвращает значение true, но значение не обновляется в тесте?

Результат, который я получаю: expected #notification_id to have changed from nil to 5, but did not change

Ответ №1:

referral в вашем тесте и referral в вашем тестируемом объекте есть два разных объекта, я готов поспорить. Изменения в одном не влияют на другое. referral в тесте не происходит волшебного извлечения обновлений из соответствующей записи базы данных, выполненной каким-либо другим кодом.

Обычно я делаю это так

 it "saves the notification id in the referral for future reference" do  expect { subject.perform(*args) }  .to change{ referral.reload.notification_id }.from(nil).to(customer_notification_delivery.id) end  

Комментарии:

1. Спасибо @Sergio Tulentsev, я попытался перезагрузить модель, используя только (referral.reload), не получилось, используя ваш подход (также добавив атрибут) У меня есть TypeError: nil is not a symbol nor a string

2. @queroga_vqz: попробуйте мой подход точно так, как показано на рисунке

3. неважно, я скучал по тебе, а также изменил его на блок, используя скобки. моя вина, и спасибо тебе!