rails / rspec: Fabricator - ассоциации тестирования (ActiveModel :: MissingAttributeError) - PullRequest
0 голосов
/ 30 мая 2018

Я пишу тесты для своих моделей и столкнулся с ошибкой, которую не могу устранить.Я использую rspec и Fabricator.Все работает нормально, когда тестируется изолированно, но когда я пытаюсь проверить ассоциации, я получаю ActiveModel :: MissingAttributeError.

models / user.rb

class User < ApplicationRecord
  ...
  validates :email, uniqueness: true, presence: true
  belongs_to :company, required: false
end

модели / company.rb

class Company < ApplicationRecord
  validates :organisation_number, uniqueness: true, presence: true
  has_many :users, dependent: :destroy
end

схема

create_table "companies", force: :cascade do |t|
  t.string "organisation_number"
  ...
end

create_table "users", id: :serial, force: :cascade do |t|
    t.string "email", default: "", null: false
    ...
    t.bigint "company_id"
    t.index ["company_id"], name: "index_users_on_company_id"
    ...
  end

fabricators / user_fabricator.rb

Fabricator :user do
  email { Faker::Internet.email }
  password '123456'
  confirmed_at Time.now
end

fabricators / company_fabricator.rb

Fabricator :company do
  organisation_number { Faker::Company.swedish_organisation_number }
end

spec / user_spec.rb (первый тест пройден, второй не пройден)

describe User do
  context '#create' do
    it 'Creates a user when correct email and password provided' do
      user = Fabricate(:user)
      expect(user).to be_valid
    end
    it 'Lets assign a company to user' do
      company = Fabricate(:company)
      expect(Fabricate.build :user, company: company).to be_valid
    end
  end
end

Я также попытался добавить компанию прямо к фабрикатору пользователей, вот так (что мне кажется правильной реализацией документации ):

Fabricator :user do
  email { Faker::Internet.email }
  password '123456'
  confirmed_at Time.now
  company
end

инаоборот, добавление пользователей в фабрикант компании, например:

Fabricator :company do
  organisation_number { Faker::Company.swedish_organisation_number }
  users(count: 3) { Fabricate(:user) }
end

, но оба подхода оставили меня с одной и той же ошибкой:

User # create Позволяет назначить компанию пользователю Failure /Ошибка: company = Fabricate (: company)
ActiveModel :: MissingAttributeError: невозможно записать неизвестный атрибут 'company_id'

Есть предложения, что я делаю не так?

1 Ответ

0 голосов
/ 30 мая 2018

Я бы написал свой собственный ответ, но я не уверен, что смог бы описать его лучше, чем RSpec, так что это взято непосредственно из Здесь :

Rails 4.x ActiveRecord::Migration ожидающие проверки миграции

Если вы не используете ActiveRecord, вам не нужно беспокоиться об этих настройках.

Пользователи Rails 4.x теперь может воспользоваться улучшенными возможностями миграции и синхронизации схемы.До RSpec 3 пользователи должны были запускать миграции вручную как в среде разработки, так и в тестовой среде.Кроме того, поведение различалось в зависимости от того, запускались ли спецификации с помощью rake или с помощью отдельной команды rspec.

С выходом Rails 4 новые API были представлены на ActiveRecord::Migration.Это позволяет RSpec воспользоваться преимуществами этих новых стандартных проверок миграции, отражая поведение по всем направлениям.

  • Rails 4.0.x

    Добавьте следующее в начало *Файл 1026 * после того, как Rails был необходим:

     ActiveRecord::Migration.check_pending!
    

    Это вызовет исключение, если будут какие-либо ожидающие изменения схемы.Пользователям по-прежнему потребуется синхронизировать среды разработки и тестирования вручную.

  • Rails 4.1 +

    В этом выпуске появилась новая замечательная функция.Пользователям больше не нужно синхронизировать среду разработки и тестирования.Чтобы воспользоваться этим преимуществом, добавьте следующее в верхнюю часть файла rails_helper после того, как Rails потребуется:

     ActiveRecord::Migration.maintain_test_schema!
    

    Вместо этого просто поднимите, когда в тестовой схеме ожидают миграции, Railsпопытается загрузить схему.Исключение теперь будет вызываться только в том случае, если после загрузки схемы ожидающие миграции ожидают выполнения.

    При использовании этого параметра необходимо учитывать несколько предостережений:

    • Миграции все еще нужно запускать вручную;хотя сейчас это нужно делать только в среде «разработки»

    • Возникнет исключение, если схема не была инициализирована.Исключение предоставят инструкции, указывающие, что необходимо запустить rake db:migrate.

Можно отказаться от проверки на наличие отложенных миграций.Поскольку это на самом деле особенность Rails, изменение должно быть сделано как часть конфигурации Rails.Для этого добавьте в файл config/environments/test.rb следующее:

config.active_record.maintain_test_schema = false

Новые проекты RSpec не должны беспокоиться об этих командах, поскольку rails generate rspec:install добавит их автоматически.

...