#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. неважно, я скучал по тебе, а также изменил его на блок, используя скобки. моя вина, и спасибо тебе!