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

Dav*_*ave 5 unit-testing rspec ruby-on-rails associations ruby-on-rails-6

I\xe2\x80\x99m 从 Rails 4.2 升级到 6。我也在使用 FactoryBot 6.2.0。我有这个型号

\n
class Book < ActiveRecord::Base\n  belongs_to :author, inverse_of: :book\n    \xe2\x80\xa6\n  validates :model, presence: true, unless: -> { author.check_vwf? }\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
describe Book do\n\n    \xe2\x80\xa6\n  it { should belong_to :author }\n
Run Code Online (Sandbox Code Playgroud)\n

但运行此测试失败并出现以下错误。看来 \xe2\x80\x9cvalidates\xe2\x80\x9d 方法正在运行,并且正在构造的实例没有 \xe2\x80\x9cbelongs_to\xe2\x80\x9d 关联,但这正是我\xe2\ x80\x99m 尝试测试 \xe2\x80\xa6

\n
 Failure/Error: validates :model, presence: true, unless: -> { author.check_vwf? }\n \n NoMethodError:\n   undefined method `check_vwf?' for nil:NilClass\n
Run Code Online (Sandbox Code Playgroud)\n

升级 Rails 的一些问题导致该测试突然失败。使用给定版本的 Rails 和 RSpec 测试关联的正确方法是什么\xe2\x80\x99?

\n

Chr*_*los 1

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

let!(:author) { create(:author) }
subject { create(:book, author: author) }
Run Code Online (Sandbox Code Playgroud)

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