Quindi, penso che ci sia probabilmente un modo più semplice per testare quello che stai cercando di testare, ma senza più contesto non so cosa consigliare. Tuttavia, qui è un codice proof-of-concept per dimostrare che ciò che si vuole fare si può fare:
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
Comunque io sto facendo un sacco di utilizzo del soggetto speciale/lasciare blocchi di contesto qui. Vedi http://benscheirman.com/2011/05/dry-up-your-rspec-files-with-subject-let-blocks/ per ulteriori informazioni su questo argomento.
Posso vedere una mancata corrispondenza su 'risultato' rispetto a' risultati' nella domanda. Probabilmente non è la tua risposta, ma vale la pena ripararla? –
Oups, errore di copia/incolla – Sebastien
Non so nemmeno se questo è possibile, ma probabilmente la soluzione corretta è iniettare l'oggetto o la classe, quindi si ha molto più controllo su di esso. Difficile dire/dare esempi senza vedere come si usa questo codice. –