2014-09-02 8 views
7

Dies ist mein Szenario:Wie ignoriert man einige Aufrufe derselben Methode mit unterschiedlichen Argumenten in Rspec?

Nach dem Aktualisieren eines AR-Objekts wird eine Reihe von Hintergrundjobs mit Resque ausgelöst. In meiner specs bin spöttisch ich den Anruf # enqueue, etwas in den Zeilen Resque:

it 'should be published' do 
    # I need to setup these mocks in many places where I want to mock a specific call to Resque, otherwise it fails 
    Resque.should_receive(:enqueue).with(NotInterestedJob1, anything) 
    Resque.should_receive(:enqueue).with(NotInterestedJob2, anything) 
    Resque.should_receive(:enqueue).with(NotInterestedJob3, anything) 

    # I'm only interested in mocking this Resque call. 
    Resque.should_receive(:enqueue).with(PublishJob, anything) 
end 

Wie Sie sehen können, muss ich alle anderen Anrufe Resque # enqueue jedes Mal verspotten möchte ich einen bestimmten verspotten Rufen Sie an, gibt es eine Möglichkeit, nur einen benutzerdefinierten Aufruf zu verspotten und die anderen Aufrufe mit anderen Argumenten zu ignorieren?

Vielen Dank im Voraus;)

+0

Ich denke, was Sie bereits geschrieben haben, sollte funktionieren - was ist das Problem? –

+0

Hallo Frederick, das Problem war, dass ich all diese Mocks überall hinzufügen musste, wenn ich einen bestimmten Resque-Call spielen wollte. – rdavila

Antwort

10

Ich denke, müssen Sie in diesem Fall zu tun, was ich als die Methode Anstoßen äquivalent as_null_object denken, aber in diesem Fall speziell für Anrufe Resque.enqueue, dass Sie nicht tun care about:

it 'should be published' do 
    allow(Resque).to receive(:enqueue) # stub out this message entirely 
    expect(Resque).to receive(:enqueue).with(PublishJob, anything) 
    call_your_method.that_calls_enqueue 
end 
+1

Danke für Ihre Hilfe Paul, ich benutze Rspec 2 also #allow und #receive sind nicht verfügbar, aber ich habe sie durch 'Resque.stub (: enqueue) .and_recturn (true)' und 'Resque.should_receive (: Enqueue) .with (PublishJob, irgendetwas) ' – rdavila