Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rspec stubbing method for only specific arguments

Tags:

ruby

rspec

Is there a way to stub method for only specific arguments. Something like this

boss.stub(:fire!).with(employee1).and_return(true) 

If any other employee is passed to boss.fire! method, I'll get boss received unexpected message error, but what I would really like is just to override the method for specific argument, and leave it be for all others.

Any ideas how this can be done?

like image 393
Milovan Zogovic Avatar asked Apr 02 '12 08:04

Milovan Zogovic


2 Answers

You can add a default stub for the fire! method which will call original implementation:

boss.stub(:fire!).and_call_original boss.stub(:fire!).with(employee1).and_return(true) 

Rspec 3 Syntax (@pk-nb)

allow(boss).to receive(:fire!).and_call_original allow(boss).to receive(:fire!).with(employee1).and_return(true) 
like image 99
Andrey Chernih Avatar answered Sep 18 '22 13:09

Andrey Chernih


You can try write your own stubbing method, with code like this

fire_method = boss.method(:fire!) boss.stub!(:fire!) do |employee|     if employee == employee1     true   else     fire_method.call(*args)   end end 
like image 30
kr00lix Avatar answered Sep 18 '22 13:09

kr00lix