<img src=“https://secure.travis-ci.org/socialcast/socialcast-shoulda-ext.png?branch=master” alt=“Build Status” />

Socialcast Shoulda Extensions

Adds new matchers and functionality to the shoulda test library

Installation

In your Gemfile:

group :test do
  gem 'socialcast_shoulda_ext', :git => 'git@github.com:socialcast/socialcast-shoulda-ext.git', :require => 'shoulda_ext'
end

If you want to include the trigger_callbacks matcher, also add the following to your test helper:

ShouldaExt::Matchers::TriggerCallbackMatcher.attach_active_record_callback_hooks!

Matchers

RecordCountChangeMatcher

Test if the count for a model has changed, and by how much. Requires the context_with_matcher_before_hooks patch, which is included by default.

Provides the following matcher methods:

  • create_record(klass_or_symbol) Alias for change_record_count.for(klass_or_symbol).by(1)

  • create_records(klass_or_symbol, amount) Alias for change_record_count.for(klass_or_symbol).by(amount)

  • destroy_record(klass_or_symbol) Alias for change_record_count.for(klass_or_symbol).by(-1)

  • destroy_records(klass_or_symbol, amount) Alias for change_record_count.for(klass_or_symbol).by(-amount)

  • change_record_count Tests the difference in record count before and after the current setup/subject block Can be used with the follow methods:

    • for(klass_or_symbol) Provides the class which the test is being performed on. Can be a constant or a symbol

    • by(amount) Provides an expected difference for the number of records for the specified class. Excluding this number will allow the matcher to check for any difference

Examples:

context "creating a blog article" do

  context "with good parameters" do
    setup do
      post :create, :blog => {:title => 'my blog post', :body => 'Ipsum lorem...'}
    end
    should create_record :blog
  end

  context "without a body" do
    setup do
      post :create, :blog => {:title => 'my blog post' }
    end
    should_not create_record Blog
  end

end

RespondWithJson

Check if the controller’s response is json

Examples:

context ":index.json" do
  setup do
    get :index, :format => 'json'
  end
  # Just check to see that the response was json
  should respond_with_json  

  # Evaluate the hash produced by the json yourself
  should respond_with_json { |json| json.first['blog']['title'] == 'blog post 1'}

  # Provide an exact match
  should respond_with_json.exactly(['blog' => {'id' => 1, 'title' => 'blog post 1'}])

  # Provide an exact match with a block
  should response_with_json.exactly{ |json| JSON.parse(Blog.all.to_json)}
end

context ":index.html" do
  setup do
    get :index
  end

  # or the negation
  should_not respond_with_json
end

TriggerCallbackMatcher

Test if create, update, destroy, or save callbacks were triggered.

Requires running ShouldaExt::Matchers::TriggerCallbackMatcher.attach_active_record_callback_hooks! in your test suite in order to work properly.

Examples:

context "doing nothing to a record" do
  subject { Blog.new :title => 'blog title' }
  should_not trigger_callbacks
end

context "creating a record" do
  subject { Blog.create! :title => 'blog title' }
  should trigger_callbacks.for :create
  should_not trigger_callbacks.for :update, :destroy
end

Integrations

Currently only integrates with test/unit. RSpec support to come.

Shoulda Extensions

ContextWithMatcherBeforeHooks

Adds the ability to define a ‘before’ method on any method which will be run before each context’s setup/subject block. Used by RecordCountChangeMatcher to record the number of records before the tested operation takes place.

Required Ruby Version

None

Authors

Geoffrey Hichborn

Versions

  1. 0.1.4 April 24, 2012 (90 KB)
  2. 0.1.2 January 06, 2012 (90.5 KB)

SHA 256 checksum