1

RSpec 2.13にアップグレードしたところ、スペックを実行すると2つの異なる警告が表示されます。

/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
4

1 に答える 1

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

この方法でコレクションを反復処理するテストを作成するということは、コレクションをループする1つのテストを実行するだけでなく、コレクション内のすべてのアイテムに対して個別のテストを実行することを意味すると思います(したがって、サブジェクトを再定義します)。これはRSpecの控えめな落とし穴であり、かなり最近まで私に多くの混乱を引き起こしたと思います。

于 2013-02-24T23:29:13.693 に答える