Also, ich denke, es gibt wahrscheinlich einen einfacheren Weg zu testen, was Sie versuchen zu testen, aber ohne mehr Kontext weiß ich nicht, was ich empfehlen soll. Doch hier ist ein Proof-of-Concept-Code zu zeigen, dass das, was Sie getan werden kann, tun:
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
jedoch vielen Einsatz von speziellem Thema, das ich mache/lassen Kontextblöcke hier. Weitere Informationen zu diesem Thema finden Sie unter http://benscheirman.com/2011/05/dry-up-your-rspec-files-with-subject-let-blocks/.
Ich kann ein Missverhältnis zwischen "Ergebnis" und "Ergebnisse" in der Frage sehen. Wahrscheinlich nicht deine Antwort, aber lohnt es sich zu reparieren? –
Oups, Kopieren/Einfügen Fehler – Sebastien
Ich weiß nicht einmal, ob das möglich ist, aber wahrscheinlich ist die richtige Lösung, das Objekt oder die Klasse zu injizieren, dann haben Sie viel mehr Kontrolle darüber. Schwer zu sagen/geben Sie Beispiele, ohne zu sehen, wie dieser Code verwendet wird. –