如何测试 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关联