首页 > 解决方案 > 如何测试 ActiveRecord 关联是否与 RSpec 一起使用?

问题描述

查看他们的 Active Record 关联是否不再被使用的最佳方法是什么?如何编写 rspec 测试以查看关联是否不再被使用?

我必须重构其他人(不再是项目的一部分)的 Rails 模型。目前,我正在使用 atom 查看是否在存储库的其他地方调用了关联,但我知道这不是最好的方法。我想为模型构建单元测试,但不完全确定如何处理关联。目前,我正在使用 shoulda 匹配器和 factory_girl_rails。

标签: ruby-on-railsactiverecordrspec

解决方案


至少有两种使用关联的方式:

  1. 显式 - 调用一个对象。

    object.association_name
    

    在这种情况下,很容易跟踪:

    expect_any_instance_of(Model).to_not receive(:association_name)
    

    另一个问题是在您的测试结构中放置这种期望的位置。

  2. 隐式 - 在复杂查询或关联数据预加载中。

    Model.all.joins(:association_name)
    Model.all.includes(:association_name)
    

    在这种情况下,很难跟踪。

我建议另一种方法:

不要跟踪关联使用情况,而是在删除关联时检查测试是否通过。您可以安全地删除测试环境的关联。

例如,您可以替换它:

has_many :association_name

有了这个:

unless Rails.env.test?
  has_many :association_name
end

这不会破坏任何东西,并且仅在运行测试时并且仅当在某处使用关联时才会引发错误。


推荐阅读