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"}