如何测试ActiveRecord关联是否与RSpec一起使用?

时间:2018-08-22 16:40:27

标签: ruby-on-rails activerecord rspec

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

我必须重构其他人(不再属于项目的一部分)Rails模型。当前,我正在使用atom来查看是否在存储库中的其他位置调用了关联,但是我知道这不是最好的方法。我想为模型建立单元测试,但是不确定如何进行关联。目前,我正在使用Shoulda Matchers和factory_girl_rails。

3 个答案:

答案 0 :(得分:0)

Rspec为此使用reflect_on_association。一个例子是

it 'has many associations' do
    assc = Model.reflect_on_association(:other_model)
    expect(assc.macro).to eq :has_many
end

答案 1 :(得分:0)

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

  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

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

答案 2 :(得分:0)

我认为这是与软件设计本身一样古老的问题。

如何检查是否不再使用某些东西?

在像ruby这样的动态语言中这是一个问题。解决此问题的方法很少。

1。通过端到端测试覆盖您的所有应用程序

通常,很难获得100%的覆盖率,并且您可能无法轻松使用此解决方案

2。删除用法,看看一切是否仍然有效

类似于要点1,但手动。在较大的系统中非常困难,而且通常不会记录所有功能。

3。猴子补丁和日志用法

对于关联,这可能是这样的:

has_namy :foos

def foos
  log 'foos is used!'
  super
end

但是,正如@chumakoff在此处https://stackoverflow.com/a/51982936/299774所说的那样,该关联可以在其他几个地方使用。因此,您需要进行一些调查才能找到所有与登录有关的地方。

此解决方案也有一个缺点:您需要等多久才能声明关联未使用?你应该等半年吗?如果没有人使用这么长时间,但是每年有一次功能被使用,怎么办呢?

那我该怎么办?

这取决于应用程序的大小和关键程度等。有时您可能会冒险,有时您决定使用一些未使用的代码。或者,您可以在Find unused code in a Rails app中获得更多创意。

或者您可以为部分用户禁用此关联,并在聚集日志/异常的地方监视异常。

也许您应该检查数据库中是否有数据库?如果不是,您是否可以找到从那里删除了所有内容的迁移?您可以联系作者吗?