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