Rspec Model Association Test не работает на подклассе модели - PullRequest
0 голосов
/ 30 января 2019
class Proofreader < Role

  has_many :proofreading_jobs,   :class_name => 'ProofreadingJob',   :foreign_key => 'proofreader_id'

end

class ProofreadingJob < ApplicationRecord

  belongs_to :proofreader, class_name: 'Role', foreign_key: :proofreader_id, optional: true
  belongs_to :client,      class_name: 'Role', foreign_key: :client_id
  end

class Role < ApplicationRecord

  belongs_to :user

end

proofreaders factory:

    FactoryBot.define do
      factory :proofreader do
        type { 'Proofreader'}
        hourly_rate { 15 }
        association :user, factory: :employee_user

        factory :proofreader_with_work_events do

          after :create do |proofreader|
            create(:user_event, :recurring_mwf, user: proofreader.user)
          end

        end
      end
    end

spec / model_roles / proofreader_spec.rb

RSpec.describe 'Proofreader', type: :model do

  describe "Associations" do
    it { should have_many(:proofreading_jobs) }
  end

end

Сбой теста с:

Failure/Error: it { should have_many(:proofreading_jobs) }
       expected Associations to respond to `has_many?`

Очевидно, что класс ProofreadingJob имеет ассоциацию там.Как я могу написать этот тест, чтобы он прошел?

1 Ответ

0 голосов
/ 30 января 2019

Прежде всего, вы должны определить предмет - объект, с которым ваши тесты будут взаимодействовать.

Это может быть что-то вроде этого:

describe "Associations" do
  expect(ProofreadingJob.new).to be_valid # ProofreadingJob.new is subject here
end

Когда вы получили пониманиепредмет вы можете проверить ассоциацию.Это может быть так:

RSpec.describe ProofreadingJob, type: :model do
  it { should have_many(:proofreading_jobs) }
end

Здесь тема определяется Rspec из строки ProofreadingJob, type: :model.Обратите внимание, что ProofreadingJob - это не строка, а фактическое название модели (класса), поэтому Rspec будет знать, как создать субъект из этой модели.

Чтобы использовать такой синтаксис, необходимо добавить shoulda-matchers

...