私はおそらく、テストしようとしているものをテストするためのより簡単な方法があると思いますが、それ以上のコンテキストがなければ何を推奨するのか分かりません。
describe "test" do
class TestClass
attr_accessor :opts
def initialize(opts={})
@opts = opts
end
def bar
[]
end
end
let!(:stubbed) do
TestClass.new(args).tap{|obj| obj.stub(:bar).and_return("bar")}
end
let!(:unstubbed) { TestClass.new(args) }
before :each do
TestClass.stub(:new) do |args|
case args
when { :foo => "foo" }
stubbed
else
unstubbed
end
end
end
subject { TestClass.new(args) }
context "special arguments" do
let(:args) { { :foo => "foo" } }
its(:bar) { should eq "bar" }
its(:opts) { should eq({ :foo => "foo" }) }
end
context "no special arguments" do
let(:args) { { :baz => "baz" } }
its(:bar) { should eq [] }
its(:opts) { should eq({ :baz => "baz" }) }
end
end
test
special arguments
bar
should == bar
opts
should == {:foo=>"foo"}
no special arguments
bar
should == []
opts
should == {:baz=>"baz"}
Finished in 0.01117 seconds
4 examples, 0 failures
しかし、私は特別な主題の使用の多くを作っている/してみましょう。ただし、ここにあなたが何をしたいかに行うことができることを示すために、いくつかの概念実証コードがありますコンテキストブロックはここにあります。その件については、http://benscheirman.com/2011/05/dry-up-your-rspec-files-with-subject-let-blocks/を参照してください。
質問で「結果」と「結果」の不一致が確認できます。おそらく答えはありませんが、修正する価値はありますか? –
Oups、コピー/ペーストエラー – Sebastien
これが可能かどうかはわかりませんが、オブジェクトやクラスを注入するのが正しい解決策である可能性があります。このコードがどのように使用されているかを見ずに例を挙げたり発言するのは難しいです。 –