开始使用BDD / TDD(Rails / Rspec)

3

我刚开始学习BDD/TDD实践(众人欢呼,知道的我也很高兴)。目前我遇到的一个问题是不知道到底哪些测试值得编写。我们以我为Sport模型编写的这组测试为例:

Factory.define :sport do |f|
  f.name 'baseball'
end


require 'spec_helper'

describe Sport do

  before(:each) do
    @sport_unsaved = Factory.build(:sport)  # returns an unsaved object
    @sport_saved = Factory.create(:sport) # returns a saved object
  end

  # Schema testing.
  it { should have_db_column(:name).of_type(:string) }
  it { should have_db_column(:created_at).of_type(:datetime) }
  it { should have_db_column(:updated_at).of_type(:datetime) }

  # Index testing.

  # Associations testing.
  it { should have_many(:leagues) }

  # Validations testing.
  it 'should only accept unique names' do
    @sport_unsaved.should validate_uniqueness_of(:name)
  end

  it { should validate_presence_of(:name) }

  it 'should allow valid values for name' do
    Sport::NAMES.each do |v|
      should allow_value(v).for(:name)
    end
  end

  it 'should not allow invalid values for name' do
    %w(swimming Hockey).each do |v|
      should_not allow_value(v).for(:name)
    end
  end

  # Methods testing.

end

我有几个具体问题:
  1. 测试关联 sport.leagues 返回的是否为空值是否值得?
  2. 如何测试确保模型无效,如果没有指定名称?
  3. 如何测试确保创建有效记录且没有任何验证错误?
我还可以继续问下去。理想情况下,应该有一些硬性规则来指导测试工作。但我猜这需要经验和实用主义。我考虑过阅读几个宝石(如 Rails 核心)的源代码,以更好地了解什么是值得测试的,什么不是。
有什么建议吗?在座有经验的测试人员能提供吗?
2个回答

2
  1. 如果你只是重新测试Rails的行为,则不需要。
  2. 是的——这是模型验证的一部分,也是一个要求,为什么不确保满足该要求呢?
  3. 测试有关保存过程的假设是个好主意,如果存在任何生命周期监听器/观察者,在保存之前可能不会被触发。

Rails核心测试不能帮助你决定在应用程序中测试什么是一个好主意。


0
  • 你应该测试什么?任何你不想被破坏的东西
  • 何时停止编写测试?当恐惧变成无聊时

因此,如果1、2、3是缺陷,如果没有展示指定的行为,那么你应该对所有3个进行测试。

从代码片段中,我个人会避免检查DB实现(哪些列存在以及它们的详细信息)。原因:我希望随着时间的推移能够更改它,而不必打破一堆测试并修复所有测试。测试只应在行为被破坏时才会失败。如果满足它们的方式(实现)发生变化,则测试不应该失败/需要修改。
关注“什么”而不是“如何”。

希望对你有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接