Почему ActiveRecord создает другой объект ruby ​​при запросе одной и той же записи? - PullRequest
0 голосов
/ 19 мая 2018

Я пытаюсь протестировать именованную область в моей модели Rails с помощью RSpec, используя FactoryBot.Я создаю несколько записей, где только одна возвращается областью действия.

RSpec.describe GemNamespace::GemModel, type: :model do

  before(:all)
    FactoryBot.create(:gem_model, :trait1)  # id 1
    FactoryBot.create(:gem_model, :trait2)  # id 2
    FactoryBot.create(:gem_model, :trait3)  # id 3
  end

  let(:included_record) { GemNamespace::GemModel.find 1 }

  describe 'my_named_scope' do
    it 'returns only records matching the conditions' do
      scope_results = GemNamespace::GemModel.my_named_scope
      expect(scope_results).to contain_exactly(included_record)
    end
  end

end

Тест не пройден, потому что хотя included_record является единственной записью в scope_results, некоторые отладки показывают, чтоincluded_record на самом деле по какой-то причине объект Ruby отличается от объекта, указанного в результатах.Таким образом, contains_exactly терпит неудачу.

Я провел тестирование объема таким образом на тоннах моделей, и это всегда работало.Единственное отличие от этого состоит в том, что модель определена внутри гема, и я расширяю ее функциональность, добавляя к ней свою именованную область в приложении Rails.

Чего мне не хватает?Почему он ведет себя так только для этой модели?

Если это имеет значение:

  • Ruby 2.5.0
  • Rails 5.1.5
  • rspec 3.7.0
  • rspec-rails 3.7.2
  • factory_bot (_rails) 4.8.2

ОБНОВЛЕНИЕ: Я положу это здесь вместо редактирования выше.Я на самом деле тестирую представление базы данных, а не таблицы.Представления не имеют столбца уникальных идентификаторов, поэтому я на самом деле не делаю GemNamespace::GemModel.find 1 выше, а вместо where(column: <condition value>).

1 Ответ

0 голосов
/ 05 июня 2018

Я решил это с обходным путем.Я не знаю слишком много о внутренностях Rails, но кажется, что представление базы данных (и соответствующая модель), не имеющее столбец id, вроде как испортило вещи (то есть, создаваемые отдельные объекты Ruby).Поэтому я просто сравнил все значения двух объектов «вручную»

# As a workaround, we're just gonna convert them both to Ruby hashes using
# the #as_json method, and compare those instead.

expect(scope_results.as_json).to contain_exactly(included_record.as_json)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...