carlosbrando / remarkable

Simplifying tests!

commit  8251fda9bad278816bb37b0b96d6a1cc199339a9
tree    69e108408b7ce9742d3ff982390ec2aecc6e100e
parent  0bbf0f4d4104d1132d8c3b42a9d2057e3e104a1d
remarkable / remarkable_rails
name age message
..
file CHANGELOG Loading commit data...
file LICENSE Thu Mar 26 03:09:11 -0700 2009 Updated license. [josevalim]
file README
file Rakefile
directory example/
file init.rb Wed Apr 08 05:00:20 -0700 2009 Allow remarkable to work as a plugin. [josevalim]
directory lib/
directory locale/ Tue Apr 21 14:43:37 -0700 2009 Added set_cookies matcher [#51 status:resolved] [josevalim]
directory spec/
remarkable_rails/README
= Remarkable Rails

Remarkable Rails is a collection of matchers to Rails. This package has some
ActionController matchers and soon some ActionView matchers.

Whenever using the Remarkable Rails gem, it will automatically add your ActiveRecord
matchers. So just one line is needed to install both:

  sudo gem install remarkable_rails

If you are using Rails 2.3, you need to have this configuration on your
config/environments/test.rb:

  config.gem "rspec",            :lib => false
  config.gem "rspec-rails",      :lib => false
  config.gem "remarkable_rails", :lib => false

And then require remarkable inside your spec_helper.rb, after "spec/rails":

  require 'spec/rails'
  require 'remarkable_rails'

== Matchers & Macros

The supported matchers and macros are:

  assign_to, filter_params, render_with_layout, respond_with, 
  respond_with_content_type, route, set_session and set_the_flash matchers.

In Remarkable 3.0, we also ported and extended redirect to and render template
from rspec rails matchers to provide I18n. You can also do:

  render_template 'edit', :layout => 'default'
  respond_with 404, :content_type => Mime::XML, :body => /Not found/

== Macro stubs

Another cool feature in Remarkable 3.0 is macro stubs, which makes your mocks
and stubs DRY and easier to maintain. An rspec default scaffold would be:

  describe TasksController do
    def mock_task(stubs={})
      @task ||= mock_model(Task, stubs)
    end

    describe “responding to #POST create” do
      it "exposes a newly created task as @task" do
        Task.should_receive(:new).with({'these' => 'params'}).
                                  and_return(mock_task(:save => true))
        post :create, :task => {:these => 'params'}
        assigns[:task].should equal(mock_task)
      end

      it "redirects to the created task" do
        Task.stub!(:new).and_return(mock_task(:save => true))
        post :create, :task => {}
        response.should redirect_to(task_url(mock_task))
      end
    end
  end

An equivalent in remarkable would be:

  describe TasksController do
    mock_models :task

    describe :post => :create, :task => { :these => 'params' } do
      expects :new,  :on => Task, :with => {'these' => 'params'}, :returns => task_proc
      expects :save, :on => task_proc, :returns => true

      should_assign_to :task, :with => task_proc
      should_redirect_to { task_url(task_proc) }
    end
  end

It automatically performs the action before running each macro. It executes the
expects as expectations (:should_receive), but you can supply :with_stubs => true
if you want it to be executed with stubs.

There are also params and mime methods:

  describe TasksController
    params :project_id => 42
    mime Mime::HTML

    describe :get => :show, :id => 37 do
      should_assign_to :project, :task

      describe Mime::XML do
        should_assign_to :project, :task
      end
    end
  end

And much more. Be sure to check macro stubs documentation.