Ruby on rails 3 BDD/TDD(Rails/Rspec)入门

Ruby on rails 3 BDD/TDD(Rails/Rspec)入门,ruby-on-rails-3,rspec,tdd,bdd,Ruby On Rails 3,Rspec,Tdd,Bdd,我刚刚开始学习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) # ret

我刚刚开始学习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
我有几个具体问题:

  • 是否值得测试association sport.leagues返回非空值
  • 如果没有指定名称,那么进行一个确保模型无效的测试怎么样
  • 进行测试以确保创建了有效记录并且没有任何验证错误,怎么样
  • 我可以继续。理想情况下,我可以遵循一些硬性规定来指导我的测试工作。但我猜这是由于经验和良好的奥立实用主义。我曾考虑阅读一些gem的源代码,如rails内核,以便更好地了解哪些值得测试,哪些不值得

    你们有经验的测试人员能提供什么建议吗

  • 如果您只是在测试Rails的行为,则不会
  • 是的——这是模型验证的一部分,也是一项要求,为什么不确保满足要求呢
  • 测试关于保存过程的假设是一个好主意,如果存在任何生命周期侦听器/观察者,则在保存之前可能不会激发这些侦听器/观察者
  • Rails核心测试不会帮助您决定在应用程序中测试什么是好主意。

    • 你应该测试什么?任何你不想被打破的东西
    • 何时停止编写测试?当恐惧变成无聊时
    因此,如果1,2,3是缺陷,如果指定的行为没有表现出来,那么您应该对所有3个进行测试

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