【问题标题】:Does respond_to really do anything for us in testing a Model在测试模型时,respond_to 真的对我们有什么帮助吗
【发布时间】:2013-02-26 04:23:40
【问题描述】:
当我们定义一个模型并且它有一些字段时,有时在一些 RSpec 测试中我会看到如下内容:
let(:network) { build(:provider_network) }
it 'responds to provider count' do
expect(network).to respond_to(:provider_count)
end
例如,我们在模型中有一个名为 provider_count 的字段,因此我们为其创建了该测试。
我想看看这是否真的有必要和测试它的好习惯?还是只是假的?
【问题讨论】:
标签:
ruby
rspec
ruby-on-rails-3.2
rspec-rails
【解决方案1】:
关于某物有多“有用”的问题几乎总是会引起争论,尤其是在测试中 - 但是,在我看来,所编写的测试是如此微不足道,以至于毫无用处。相反,任何涵盖真正功能的测试(例如,使用provider_count 字段的测试)也将固有地测试模型是否响应provider_count。正如所写,测试有点像"foo".should == "foo" 有什么意义?
您实际上是在测试表单,而不是在这里发挥作用。单元测试应该几乎总是测试功能而不是形式。
我认为这个测试不是杂乱无章的唯一情况是作为文档的主要位置。例如,如果provider_count 是一个非规范化字段,看起来像是未来删除的候选对象,或者涉及错误修复,那么将此测试作为稍后将要中断的点,以吸引未来的开发人员关注测试将是好的。一旦他们的眼睛被吸引,那么你就会有文档告诉他们provider_count 不能简单地删除或更改的原因。如果您确定有人可能会想移除它,它是一个避雷针,可以告诉人们该领域的用途。
当然,理论上,如果有人弄乱provider_count,你会在其他地方进行另一个功能更强大的测试,所以唯一的价值是预测有人会破坏它并混淆其他测试如何不是从他们的改变中过去的。这是太多的猜测和算命,我会尽量避免这种冲动作为 YAGNI 的延伸。