在测试模型时,respond_to确实为我们做了什么

时间:2013-02-26 04:23:40

标签: ruby rspec ruby-on-rails-3.2 rspec-rails

当我们定义一个模型并且它有一些字段时,有时在一些RSpec测试中我看到这样的东西:

let(:network) { build(:provider_network) }

  it 'responds to provider count' do
    expect(network).to respond_to(:provider_count)
  end

所以例如我们在模型中有一个名为provider_count的字段,所以我们为它创建了测试。
我想看看这是否真的有必要并且是一个很好的做法来测试它?或者它只是假的?

1 个答案:

答案 0 :(得分:1)

关于“有用”某些东西的问题几乎总是有争议,特别是在测试中 - 但是,在我看来,所写的测试是如此微不足道,以至于无用。相反,任何涵盖真实功能的测试 - 例如使用 provider_count字段的测试 - 也将固有地测试模型是否响应provider_count。如上所述,测试有点像"foo".should == "foo"有什么意义?

你实际上是在测试表单,而不是在这里运行。单元测试几乎总是测试功能而不是形式。

我认为这个测试不仅仅是一个非常重要的东西,是我头脑中唯一的一个案例。例如,如果provider_count是一个非规范化字段,似乎是将来删除的候选字段,或者涉及错误修正,那么将此测试作为一个意志突破的后续点,以便将未来的开发人员的眼睛吸引到测试中没关系。一旦他们的目光被吸引,那么你在那里有文件可以告诉他们provider_count不能简单地被移除或改变的原因。如果你确定某人可能想要移除它,那就是告诉人们该领域目的的避雷针。

当然,从理论上讲,如果有人与provider_count混淆,你会在其他地方进行另一个功能更强的测试,所以唯一的价值在于预测有人会破坏它并对如何其他测试并没有从他们的变化中消失。这是如此多的猜测和运气,我会尽量避免这种冲动作为YAGNI的延伸。