Module: RSpec::Rails::Matchers

Included in:
RailsExampleGroup
Defined in:
lib/rspec/rails/matchers.rb,
lib/rspec/rails/matchers/be_a_new.rb,
lib/rspec/rails/matchers/be_valid.rb,
lib/rspec/rails/matchers/active_job.rb,
lib/rspec/rails/matchers/redirect_to.rb,
lib/rspec/rails/matchers/have_rendered.rb,
lib/rspec/rails/matchers/be_new_record.rb,
lib/rspec/rails/matchers/routing_matchers.rb,
lib/rspec/rails/matchers/have_http_status.rb

Overview

Container module for Rails specific matchers.

Defined Under Namespace

Modules: ActiveJob, HaveHttpStatus, RedirectTo, RenderTemplate, RoutingMatchers Classes: BeANew

Instance Method Summary (collapse)

Instance Method Details

- (Object) be_a_new(model_class)

Passes if actual is an instance of model_class and returns false for persisted?. Typically used to specify instance variables assigned to views by controller actions

Use the with method to specify the specific attributes to match on the new record.

Examples:

get :new
assigns(:thing).should be_a_new(Thing)
post :create, :thing => { :name => "Illegal Value" }
assigns(:thing).should be_a_new(Thing).with(:name => nil)
77
78
79
# File 'lib/rspec/rails/matchers/be_a_new.rb', line 77
def be_a_new(model_class)
  BeANew.new(model_class)
end

- (Object) be_new_record

Passes if actual returns false for persisted?.

Examples:

get :new
expect(assigns(:thing)).to be_new_record
25
26
27
# File 'lib/rspec/rails/matchers/be_new_record.rb', line 25
def be_new_record
  BeANewRecord.new
end

- (Object) be_valid(*args)

Passes if the given model instance's valid? method is true, meaning all of the ActiveModel::Validations passed and no errors exist. If a message is not given, a default message is shown listing each error.

Examples:

thing = Thing.new
expect(thing).to be_valid
44
45
46
# File 'lib/rspec/rails/matchers/be_valid.rb', line 44
def be_valid(*args)
  BeValid.new(*args)
end

- (Object) have_been_enqueued

Passes if a job has been enqueued. May chain at_least, at_most or exactly to specify a number of times.

Examples:

before { ActiveJob::Base.queue_adapter.enqueued_jobs.clear }
HeavyLiftingJob.perform_later
expect(HeavyLiftingJob).to have_been_enqueued
HelloJob.perform_later
HeavyLiftingJob.perform_later
expect(HeavyLiftingJob).to have_been_enqueued.exactly(:once)
3.times { HelloJob.perform_later }
expect(HelloJob).to have_been_enqueued.at_least(2).times
HelloJob.perform_later
expect(HelloJob).to enqueue_job(HelloJob).at_most(:twice)
HelloJob.perform_later
HeavyLiftingJob.perform_later
expect(HelloJob).to have_been_enqueued
expect(HeavyLiftingJob).to have_been_enqueued
HelloJob.set(wait_until: Date.tomorrow.noon, queue: "low").perform_later(42)
expect(HelloJob).to have_been_enqueued.with(42).on_queue("low").at(Date.tomorrow.noon)
235
236
237
238
# File 'lib/rspec/rails/matchers/active_job.rb', line 235
def have_been_enqueued
  check_active_job_adapter
  ActiveJob::HaveBeenEnqueued.new
end

- (Object) have_enqueued_job(job = nil) Also known as: enqueue_job

Passes if a job has been enqueued inside block. May chain at_least, at_most or exactly to specify a number of times.

Examples:

expect {
  HeavyLiftingJob.perform_later
}.to have_enqueued_job
# Using alias
expect {
  HeavyLiftingJob.perform_later
}.to enqueue_job
expect {
  HelloJob.perform_later
  HeavyLiftingJob.perform_later
}.to have_enqueued_job(HelloJob).exactly(:once)
expect {
  3.times { HelloJob.perform_later }
}.to have_enqueued_job(HelloJob).at_least(2).times
expect {
  HelloJob.perform_later
}.to have_enqueued_job(HelloJob).at_most(:twice)
expect {
  HelloJob.perform_later
  HeavyLiftingJob.perform_later
}.to have_enqueued_job(HelloJob).and have_enqueued_job(HeavyLiftingJob)
expect {
  HelloJob.set(wait_until: Date.tomorrow.noon, queue: "low").perform_later(42)
}.to have_enqueued_job.with(42).on_queue("low").at(Date.tomorrow.noon)
203
204
205
206
# File 'lib/rspec/rails/matchers/active_job.rb', line 203
def have_enqueued_job(job = nil)
  check_active_job_adapter
  ActiveJob::HaveEnqueuedJob.new(job)
end

- (Object) have_http_status(target)

Passes if response has a matching HTTP status code.

The following symbolic status codes are allowed:

  • Rack::Utils::SYMBOL_TO_STATUS_CODE
  • One of the defined ActionDispatch::TestResponse aliases:
    • :error
    • :missing
    • :redirect
    • :success

Examples:

Accepts numeric and symbol statuses

expect(response).to have_http_status(404)
expect(response).to have_http_status(:created)
expect(response).to have_http_status(:success)
expect(response).to have_http_status(:error)
expect(response).to have_http_status(:missing)
expect(response).to have_http_status(:redirect)

Works with standard response objects and Capybara's page

expect(response).to have_http_status(404)
expect(page).to     have_http_status(:created)

Raises:

  • (ArgumentError)

See Also:

358
359
360
361
# File 'lib/rspec/rails/matchers/have_http_status.rb', line 358
def have_http_status(target)
  raise ArgumentError, "Invalid HTTP status: nil" unless target
  HaveHttpStatus.matcher_for_status(target)
end