¶ ↑
Not A MockA cleaner and DRYer alternative to mocking and stubbing with RSpec.
¶ ↑
A Quick Introduction¶ ↑
Mocking (Not)When you’re setting up for a spec, you can ask that method calls on an object be recorded:
object.track_methods(:name, :length)
Once your code has run, you can make assertions about what methods were called, what arguments they took, their results, etc.
object.should have_received(:length).without_args.and_returned(42) object.should have_received(:name).twice
See NotAMock::Matchers for an explanation of the available assertions, plus Object#track_methods and Object#untrack_methods.
¶ ↑
Stubbing¶ ↑
Stubbing MethodsYou can replace a method on an object with a stub version like this:
object.stub_method(:method => return_value)
Any call to method
after this will return return_value
without invoking the method’s usual code.
Calls to stub methods are recorded as if you had called track_methods
on them, so you can make assertions about them as shown above.
See Object#stub_methods, Object#unstub_methods.
¶ ↑
Stubbing ObjectsYou can also replace an entire object with a stub version like this:
my_object = MyClass.stub_instance(:method_a => return_value, :method_b => return_value, ...)
The returned my_object
is a stub instance of MyClass with the given methods defined to provide the corresponding return values.
See Object.stub_instance.
¶ ↑
Stubbing ActiveRecord InstancesWhen you call stub_instance
on an ActiveRecord::Base subclass, Not A Mock automatically provides an id
method and generates an id for the object.
¶ ↑
Installation(The following describes using NotAMock with Rails. It should also be possible to use it outside of Rails, but I haven’t tried it.)
First, install the rspec and rspec_on_rails plugins:
ruby script/plugin install http://rspec.rubyforge.org/svn/tags/CURRENT/rspec ruby script/plugin install http://rspec.rubyforge.org/svn/tags/CURRENT/rspec_on_rails ruby script/generate rspec
(See rspec.info/documentation/rails/install.html for more details.)
Second, install the not_a_mock plugin:
ruby script/plugin install git://github.com/notahat/not_a_mock.git
Finally, add the following to your project’s spec/spec_helper.rb:
config.mock_with NotAMock::RspecMockFrameworkAdapter
¶ ↑
ContributingSend bugs, patches, and suggestions to Pete Yandell (pete@notahat.com)
Thanks to Pat Allan and Steve Hayes for contributing patches.