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.