2013-02-24 14 views
1

我剛剛升級到RSpec的2.13和運行我的規格時,我看到兩個不同的警告:RSpec的2.13預警:受以往的定義在這裏

/Users/peterbrown/.rvm/gems/ruby-2.0.0-p0/gems/rspec-core-2.13.0/lib/rspec/core/memoized_helpers.rb:120: warning: method redefined; discarding old subject 
/Users/peterbrown/code/classy_enum/spec/classy_enum/active_record_spec.rb:63: warning: previous definition of subject was here 

我懷疑它是與我是如何遍歷一個數組,每次定義一個新的主題:

describe DefaultDog do  
    context "with valid breed options" do 
    [:golden_retriever, 'golden_retriever', Breed::GoldenRetriever.new, Breed::GoldenRetriever].each do |option| 
     subject { DefaultDog.new(:breed => option) } 
     it { should be_valid } 
     its(:breed) { should be_a(Breed::GoldenRetriever) } 
    end 
    end 
end 

在這樣的循環中定義主題是否存在問題?

更新:

我也應該注意到,我跑我的規格與-w選項:

RSpec::Core::RakeTask.new(:spec) do |t| 
    t.ruby_opts = "-w" 
end 

回答

1

嘗試把context你的循環中:

describe DefaultDog do  
    [:golden_retriever, 'golden_retriever', Breed::GoldenRetriever.new, Breed::GoldenRetriever].each do |option| 
    context "with valid breed option #{option}" do 
     subject { DefaultDog.new(:breed => option) } 
     it { should be_valid } 
     its(:breed) { should be_a(Breed::GoldenRetriever) } 
    end 
    end 
end 

我相信編寫測試涉及以這種方式迭代集合意味着您將執行一個separ對集合中的每個項目進行測試,而不是隻執行一次循環通過集合(因此重新定義主題)的測試。我認爲這是RSpec的一個低估的問題,直到最近才引起我很大的困惑。

+0

這樣做的伎倆,謝謝! – 2013-02-25 00:24:33