RSpec::ActiveModel::Mocks provides tools for testing ActiveModel
classes.
mock_model(Person, name: "Fred")
Add this line to your application's gemfile:
gem 'rspec-activemodel-mocks'
And then execute:
$ bundle
To finish the installation and start using stub_model
and mock_model
, require the following file in your spec_helper.rb
or rails_helper.rb
.
require 'rspec/active_model/mocks'
Creates a test double representing string_or_model_class
with common ActiveModel methods stubbed out. Additional methods may be easily stubbed (via add_stubs
) if stubs
is passed. This is most useful for impersonating models that don't exist yet.
ActiveModel methods, plus new_record?
, are stubbed out implicitly. new_record?
returns the inverse of persisted?
, and is present only for compatibility with extension frameworks that have yet to update themselves to the ActiveModel API (which declares persisted?
, not new_record?
).
string_or_model_class
can be any of:
- A String representing a Class that does not exist
- A String representing a Class that extends
ActiveModel::Naming
- A Class that extends
ActiveModel::Naming
Creates an instance of Model
with to_param
stubbed using a generated value that is unique to each object. If Model
is an ActiveRecord
model, it is prohibited from accessing the database.
For each key in stubs
, if the model has a matching attribute (determined by respond_to?
) it is simply assigned the submitted values. If the model does not have a matching attribute, the key/value pair is assigned as a stub return value using RSpec's mocking/stubbing framework.
persisted?
is overridden to return the result of !id.nil?
This means that by default persisted?
will return true. If you want the object to behave as a new record, sending it as_new_record
will set the id to nil. You can also explicitly set :id => nil
, in which case persisted?
will return false, but using as_new_record
makes the example a bit more descriptive.
While you can use stub_model
in any example (model, view, controller, helper), it is especially useful in view examples, which are inherently more state-based than interaction-based.
stub_model(Person) stub_model(Person).as_new_record stub_model(Person, :to_param => 37) stub_model(Person) {|person| person.first_name = "David"}