RSpec: недействительная модель с поиском - PullRequest
0 голосов
/ 27 ноября 2018

Я не совсем уверен, что делаю все правильно, но у меня есть две модели: House, что has_one Address.

Модель Address имеет:

class Address < ApplicationRecord
  searchkick
  belongs_to :house
end

Я пытаюсь проверить свои house_controller с RSpec следующим образом

RSpec.describe HousesController do
 context 'GET #index' do
 before { get :index }
 it     { is_expected.to render_template('index') }

 it 'assigns @houses' do
  h = create(:house)
  expect(assigns(:houses).results).to eq([h])
end
...

Тем не менее, я всегда получаю результат, который я не ожидаю.Код моего контроллера следующий:

def index
 if params[:term].present?
  @houses = House.search(params[:term])
 else
  @houses = House.search('*')
 end
end

Я не уверен, что понимаю это, но, может быть, так как я использую FactoryBot, он создает много домов, а затемпри использовании метода index там есть куча домов, причем не только и точно h?

Это моя ошибка:

Failures:

  1) HousesController GET #index assigns @houses
     Failure/Error: expect(assigns(:houses).results).to eq([h])

       expected: [#<House id: 763, rent: 1173, deposit: 739, description: "Rerum cado curso curo alias.", preferred_ge...2018-11-26 21:40:43", available_at: "2018-12-17", user_id: 15945, lease_length: nil, built_in: nil>]
            got: [#<House id: 215, rent: 0.839e3, deposit: 0.797e3, description: "Rerum aeneus taceo crepusculum aestu...2018-11-26 21:17:53", available_at: "2018-12-17", user_id: 15776, lease_length: nil, built_in: nil>]

       (compared using ==)

       Diff:
       @@ -1,2 +1,5 @@
       -[#<House id: 763, rent: 1173, deposit: 739, description: "Rerum cado curso curo alias.", preferred_gender: 0, created_at: "2018-11-26 21:40:43", updated_at: "2018-11-26 21:40:43", available_at: "2018-12-17", user_id: 15945, lease_length: nil, built_in: nil>]
       +[#<House id: 215, rent: 0.839e3, deposit: 0.797e3, description: "Rerum aeneus taceo crepusculum aestus.", preferred_gender: 0, created_at: "2018-11-25 12:50:11", updated_at: "2018-11-25 12:50:11", available_at: "2018-12-16", user_id: 8065, lease_length: nil, built_in: nil>,
       + #<House id: 235, rent: 0.519e3, deposit: 0.642e3, description: "Cicuta totidem arbustum arcesso fugit tego.", preferred_gender: 0, created_at: "2018-11-25 12:54:28", updated_at: "2018-11-25 12:54:28", available_at: "2018-12-16", user_id: 8085, lease_length: nil, built_in: nil>,
       + #<House id: 648, rent: 0.668e3, deposit: 0.1104e4, description: "Corporis tametsi demens.", preferred_gender: 0, created_at: "2018-11-26 21:17:43", updated_at: "2018-11-26 21:17:43", available_at: "2018-12-17", user_id: 15775, lease_length: nil, built_in: nil>,
       + #<House id: 649, rent: 0.799e3, deposit: 0.611e3, description: "Ut ancilla tredecim.", preferred_gender: 0, created_at: "2018-11-26 21:17:53", updated_at: "2018-11-26 21:17:53", available_at: "2018-12-17", user_id: 15776, lease_length: nil, built_in: nil>]

     # ./spec/controllers/houses_controller_spec.rb:12:in `block (3 levels) in <top (required)>'

Я начинаю с RSpecсейчас, и мне действительно нужны усилия и часы, чтобы попытаться понять их, заранее большое спасибо!

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Searchkick документы об отключении индексирования для тестов с помощью RSpec.

Вы не хотите обновлять свои объекты в Elasticsearch всегда во время выполнения тестов.Вы хотите сделать это только тогда, когда будете явно тестировать свою функцию поиска (или индексировать / удалять из индекса).Для этого вам необходимо отключить обратные вызовы searchkick, определить собственный тег для ваших тестов и включить индексацию только для этих тестов.Вам также может потребоваться очистить ваш индекс после теста / группы тестов.

@ Вич также важен, вы в настоящее время создаете свой объект слишком поздно, после запроса.

Iизменил бы ваши настройки на:

context 'GET #index', :search do
  let!(:house) { create(:house) }
  before { get :index }

  it 'assigns @houses' do
    expect(assigns(:houses).results).to eq([house])
  end
end
0 голосов
/ 27 ноября 2018

Попробуйте создать house в блоке before:

context 'GET #index' do
  before do
    let!(:house) { create(:house) }
    get :index
  end

  it { is_expected.to render_template('index') }

  it 'assigns @houses' do
    expect(assigns(:houses).results).to eq([house])
  end
end

Обратите внимание на пару вещей:

  1. В отличие от let, let! - этонемедленно вызывается (таким образом, создается ваша запись до того, как будет выполнено действие index)
  2. Добавьте точку останова (IDE) или используйте отладчик (byebug, pry и т. д.) и поместите ее перед вызовом get :index, чтобы увидеть, что(если есть) дома уже существуют.
...