如何测试 belongs_to 与 Rails 6 和 RSpec 4.1 的关联?

Posted

技术标签:

【中文标题】如何测试 belongs_to 与 Rails 6 和 RSpec 4.1 的关联?【英文标题】:How do I test belongs_to associations with Rails 6 and RSpec 4.1? 【发布时间】:2022-01-11 04:49:56 【问题描述】:

我正在从 Rails 4.2 升级到 6。我也在使用 FactoryBot 6.2.0。我有这个模型

class Book < ActiveRecord::Base
  belongs_to :author, inverse_of: :book
    …
  validates :model, presence: true, unless: ->  author.check_vwf? 

我有一个 RSpec (rspec-rails 4.1.2 ) 测试,我想在其中测试关联……

describe Book do

    …
  it  should belong_to :author 

但运行此测试失败并出现以下错误。看起来“validates”方法正在运行,并且正在构建的实例没有“belongs_to”关联,但这正是我想要测试的……

 Failure/Error: validates :model, presence: true, unless: ->  author.check_vwf? 
 
 NoMethodError:
   undefined method `check_vwf?' for nil:NilClass

升级我的 Rails 导致这个测试突然失败。给定版本的 Rails 和 RSpec 测试关联的正确方法是什么?

【问题讨论】:

请提供图书工厂的代码。另外,测试中是否创建了 book 对象? “...”只是其他“it”关联检查。没有显式调用来创建对象的实例。 @Dave 你能用这两个模型更新你的问题吗?关联和inverse_of 似乎有问题 您能否提供有关您的工厂的详细信息以及您如何在规格中使用它们?你用过工厂机器人吗? 【参考方案1】:

应该匹配器正在定义一个subject by default,但是这个主题给你的情况带来了问题。您可以尝试在测试文件的开头添加以下内容以覆盖默认文件。

let!(:author)  create(:author) 
subject  create(:book, author: author) 

假设您已经定义了作者和图书工厂。

【讨论】:

试一试,但没有骰子。我不认为“应该属于”测试使用的是我定义的主题。 你的主题是什么?【参考方案2】:

我认为您的问题可能与您的协会有关。 从 Rails 5 开始,默认情况下需要 belongs_to 关联。

如果您希望能够在没有关联的情况下创建记录,您需要添加以下内容:

 belongs_to :author, inverse_of: :book, optional: true

【讨论】:

以上是关于如何测试 belongs_to 与 Rails 6 和 RSpec 4.1 的关联?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 5:将belongs_to关联与自定义名称添加到模型和迁移

Rails ActiveRecord - 获取与锁定的belongs_to关联

如何在rails 4中创建新的belongs_to关联模型

Rails:如何访问视图中的belongs_to字段?

Rails 使用同一命名空间中的模型作为 belongs_to 引用,如何从外部引用模型

rails 覆盖关系的默认 getter (belongs_to)