【问题标题】:Rspec Model Association Test not working on model subclassRspec模型关联测试不适用于模型子类
【发布时间】:2019-01-30 03:17:32
【问题描述】:
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 类在那里有关联。如何编写此测试以使其通过?

【问题讨论】:

  • 你能分享ProofreadingJob模型协会吗?
  • 根据要求,我添加了 ProofreadingJob 类
  • 你可以试试这个it { should have_many(:proofreading_jobs).class_name('ProofreadingJob').with_foreign_key('proofreader_id') }
  • 你有Factory 的Proofreader 模型吗?并正确配置shoulda-matchers
  • 尝试了您的建议并得到:#<:matchers::builtin::has:0x007fdde8aa7918> 的未定义方法 `class_name'

标签: ruby-on-rails rspec ruby-on-rails-5 rspec-rails


【解决方案1】:

首先,您必须定义一个主题 - 您的测试将与之交互的对象。

可能是这样的:

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

【讨论】:

  • 感谢 megas,我已经更新了我的规范,添加了 type: :model 并且我得到了 NoMethodError: undefined method `reflect_on_association' for String:Class。我确实安装了 shoulda-matcheres gem。
  • 我根据您在回答中的解释弄清楚了。我有 RSpec.describe 'ProofreadingJob', type: :model 在引号中,所以它把它看作一个字符串。我删除了引号,现在它可以工作了。谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多