Подтвердить что ты не робот

"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?

Спасибо.

4b9b3361

Ответ 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.