Misc tips and tricks »

Created at: 30.01.2008 10:00, source: Rails on the Run - Home, tagged: autotest bdd bdd integration rspec rspec testing zentest

I haven't posted for quite a long time. The thing is I moved to a new place and I'm really busy on working clients + setting up my new office + dealing with way too much paperwork.

Anyway, enough excuses, here are few tips that I believe will be useful to some of you:

ZenTest Autotest

I love autotest, but you might have noticed that sometimes (especially on big projects), ZenTest might start using more CPU than expected. On my machine, that results in the fan going off and annoying the crap out of me.

The solution is quite simple, exclude all folders you don't need to monitor. To do that, update ZenTest to version 3.8.X

sudo gem update ZenTest

(older version had a different syntax)

Now, edit your .autotest that should be located in ~/.autotest (if it doesn't exist, create it).

Finally add the following code:

1
2
3
4

  Autotest.add_hook :initialize do |at|
    %w{.svn .hg .git vendor}.each {|exception| at.add_exception(exception)}
  end

I personally freeze rails in vendor and I autotest is way happier when it doesn't have to monitor some extra files. (note that we also exclude folders such as .git or .svn) (you can also include files etc... read more there)

RSpec

RSpec is certainly my favorite Ruby tool and I'm glad to say that most of my SD.rb friends finally got convinced!

Now, few people complained to me about spec failures outputting the full stack such as:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

 The Sessions controller should fail since it's a test' FAILED
 expected true, got false
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/expectations.rb:52:in `fail_with'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/expectations/handler.rb:21:in `handle_matcher'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/expectations/extensions/object.rb:34:in `should'
 ./spec/controllers/sessions_controller_spec.rb:25:
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/example/example_methods.rb:78:in `instance_eval'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/example/example_methods.rb:78:in `run_with_description_capturing'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/example/example_methods.rb:19:in `execute'
 /opt/local/lib/ruby/1.8/timeout.rb:48:in `timeout'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/example/example_methods.rb:16:in `execute'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:288:in `execute_examples'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:287:in `each'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:287:in `execute_examples'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:121:in `run'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:22:in `run'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:21:in `each'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:21:in `run'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/runner/options.rb:89:in `run_examples'
 test_app-git/trunk/vendor/plugins/rspec/lib/spec/runner/command_line.rb:19:in `run'
 script/spec:4:

  Finished in 6.035147 seconds

  400 examples, 1 failure

We can really easily change that, open you spec.opts file located in your spec folder.

it probably looks like that:

1
2
3
4
5
6
7
8

  --colour
  --format
  progress
  --loadby
  mtime
  --reverse
  --backtrace

Get rid of "--backtrace" and your new failure should look like:

1
2
3
4
5
6
7
8
9
10
11

  1)
  'The Sessions controller The Sessions controller should fail since it's a test' FAILED
  expected false, got true
  ./spec/controllers/sessions_controller_spec.rb:25:
  script/spec:4:

  Finished in 0.269956 seconds

  15 examples, 1 failure
  

Other stuff you may find interesting (in no particular order):


more »

RSpec on Rails Matchers plugin »

Created at: 04.01.2008 05:46, source: Rails on the Run - Home, tagged: matchers rspec rspec test testing

RSpec is an awesome testing framework. On top of being the first Ruby BDD framework the core team is doing a great job in enhancing our testing experience and therefore the quality of our code.

This time, I don't want to introduce to the latest changes but instead showing you what Josh Knowles, Bryan Helmkamp and myself came up with.

RSpec on Rails matchers plugin + TextMate Bundle

Matchers are some sort of helpers that will help you cleaning up your tests. We simply came up with a collection of matchers that we think will make your like easier.

We divided the matchers in 3 categories:

Associations

Verify that the association has been defined. (doesn't verify that the association works!)

Usage examples:

1
2
3
4
5
6
7
8

    @post.should have_many(:comments)
  
    @comment.should belong_to(:post)
  
    @user.should have_one(:social_security_number)
  
    @project.should have_and_belong_to_many(:categories)

Validations

Verify that a validation has been defined. (doesn't test the validation itself)

1
2
3
4
5
6
7
8
9
10

    object.should validate_presence_of(:attribute)

    object.should validate_confirmation_of(:attribute)

    object.should validate_uniqueness_of(:attribute)

    object.should validate_length_of(:attribute, :between => 5..10)
    
    object.should validate_length_of(:attribute, :is => 5)

Views

My personal favorite matchers, you can now do stuff like:

1
2
3
4
5
6
7
8
9
10
11
12

    it "should render new form" do
        render "/users/new.html.erb"

        response.should have_form_posting_to(users_path) do
          with_text_field_for(:user_name)
          with_text_area_for(:user_address)
          with_text_field_for(:user_login)
          with_text_field_for(:user_email)
          with_submit_button
        end
    end

Check the readme for more information and details on the added matchers. I personally recommend you try the TextMate Bundle on top of being a perfect tool for lazy devs, it also lists all the available matchers and is an excellent way of learning.

We just released our first release yesterday, this is not a final version and we will keep on improving the code. If you have suggestions and patches feel free to open a ticket there.


more »

Loading all Rails test fixtures with fixtures :all »

Created at: 27.05.2007 19:39, source: Cody Fauser - Show all, tagged: rails rails testing

Are you as tired as we were of loading 20+ different fixtures in each of your Rails test classes? We were, and we even added a method all_fixtures() to test_helper.rb to do the loading of all our fixtures for us.

Thankfully though, we don't need our own helper method anymore, as the Rails fixtures() method will now accept a symbol :all, which will instruct the test helper to load all of your fixtures automatically.

1
2
3
4
5
6
7
8

require File.dirname(__FILE__) + '/../test_helper'

class ShopTest < Test::Unit::TestCase
  fixtures :all

  # Your tests here
end

As of Rails 1.2.3 this feature has not yet been merged from the trunk. This means that you'll either need to run Edge Rails from Subversion, or install the beta Rails gems as follows:


sudo gem install -s http://gems.rubyonrails.org rails -y

Happy testing!


more »