查看是否不再使用其Active Record关联的最佳方法是什么?如何编写rspec测试以查看是否不再使用该关联?
我必须重构其他人(不再属于项目的一部分)Rails模型。当前,我正在使用atom来查看是否在存储库中的其他位置调用了关联,但是我知道这不是最好的方法。我想为模型建立单元测试,但是不确定如何进行关联。目前,我正在使用Shoulda Matchers和factory_girl_rails。
答案 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)
至少有两种使用关联的方式:
明确-调用对象。
object.association_name
在这种情况下,很容易跟踪:
expect_any_instance_of(Model).to_not receive(:association_name)
另一个问题是将这种期望放在测试结构中的什么位置。
隐式-在复杂的查询或相关的数据预加载中。
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这样的动态语言中这是一个问题。解决此问题的方法很少。
通常,很难获得100%的覆盖率,并且您可能无法轻松使用此解决方案
类似于要点1,但手动。在较大的系统中非常困难,而且通常不会记录所有功能。
对于关联,这可能是这样的:
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中获得更多创意。
或者您可以为部分用户禁用此关联,并在聚集日志/异常的地方监视异常。
也许您应该检查数据库中是否有数据库?如果不是,您是否可以找到从那里删除了所有内容的迁移?您可以联系作者吗?