"nil не является символом" для подсчета модели в rspec matcher
Я пытаюсь написать тест интеграции, где, если пользователь нажимает кнопку, он создает новую запись в базе данных (модель CheckPrice).
Я запускаю ошибку nil is not a symbol
, когда пытаюсь запустить мой тест.
require 'spec_helper'
describe 'CheckPrice', type: :request, js: true do
it "should create a new CheckPrice record when user clicks Check Price on topic page" do
city = create :city
hotel = create :hotel
affiliate_link = create :affiliate_link
visit '/hotel-bilboa-hotel'
sleep 2
click_button "Check Prices"
response.should change(CheckPrice.count).by(1)
end
end
Когда нажимается "Проверить цены", появляется прослушиватель событий, который запускает новый метод в checkprices_controller.
В последней строке response.should change(CheckPrice.count).by(1)
появляется ошибка. Похоже, что метод не распознает модель CheckPrice. Как ссылаться на таблицу CheckPrice?
Спасибо.
Ответы
Ответ 1
Я не думаю, что вы можете использовать соответствующий тег change
как на объекте ответа. Попробуйте следующее:
expect {
click_button "Check Prices"
}.to change{ CheckPrice.count }.by(1)
Это также дает более смысловой смысл ИМО.
Подробнее см. этот обманщик.
Ответ 2
Отложите семантику, чтобы ответить на исходный вопрос (получение "ниль не символ" ) и помочь другим людям, которые могли бы приземлиться здесь, как я: обязательно используйте фигурные скобки {} вместо круглых скобок().
Итак (правильно)
response.should change{CheckPrice.count}.by(1)
response.should change(CheckPrice, :count).by(1)
вместо (не будет работать, см. выше 2)
response.should change(CheckPrice.count).by(1)
Edit:
Тот же ответ с рекомендуемый синтаксис ожидания
Итак (правильно)
expect{response}.to change{CheckPrice.count}.by(1)
expect{response}.to change(CheckPrice, :count).by(1)
вместо (не будет работать, см. выше 2)
expect{response}.to change(CheckPrice.count).by(1)
Ответ 3
Другой способ сделать это:
expect do
click_button "Check Prices"
end.to change(CheckPrice, :count).by(1)
Что означает, что вывод метода count
на CheckPrice
- это то, что должно меняться. Когда два параметра передаются на change
, один считается приемником, другой - символом для отправки.
Ответ 4
Я столкнулся с одной и той же проблемой, так как другие ответы говорят, что оба метода expect
и change
в этом случае ожидают блок как параметр.
Итак, в рельсах вы можете использовать синтаксисы {} или do
end
.