Skip to main content

TOTD# 36: Writing First Test for a Rails Application

Posted by arungupta on July 1, 2008 at 6:23 AM PDT

I've created a Rails "Hello World" app href="http://blogs.sun.com/arungupta/tags/rubyonrails">numerous
times. But I decided to write a simple using the testing
framework provided by Rails. This blog explains my experience of
writing such a test.

  1. Create a "Hello World" app as:


    cellpadding="2" cellspacing="2">
    ~/samples/jruby/test
    >~/testbed/jruby-1.1.2/bin/jruby
    -S rails helloworld
            


          create 

          create 
    app/controllers

          create 
    app/helpers

          create 
    app/models

          create 
    app/views/layouts

          create 
    config/environments

          create 
    config/initializers



    . . .



          create 
    log/production.log

          create 
    log/development.log

          create 
    log/test.log



    There is no "-d mysql" in the command because I don't expect this
    application to do any database access. The database access is disabled
    by following href="http://blogs.sun.com/arungupta/entry/totd_26_overriding_database_defaults">TOTD
    #26.

  2. I tried generating a new controller using the command:


    cellpadding="2" cellspacing="2">
    ~/samples/jruby/test/helloworld
    >~/testbed/jruby-1.1.2/bin/jruby
    script/generate controller home index



    and got the error:


    cellpadding="2" cellspacing="2">
    JRuby
    limited openssl loaded. gem install jruby-openssl for full support.

    http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL

    /Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:278:in
    `load_missing_constant': uninitialized constant ActiveRecord (NameError)

           
    from
    /Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:467:in
    `const_missing'

           
    from
    /Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:479:in
    `const_missing'

           
    from /Users/arungupta/samples/jruby/test/helloworld style="font-weight: bold;">/config/initializers/new_rails_defaults.rb:5:in
    `/Users/arungupta/samples/jruby/test/helloworld/config/initializers/new_rails_defaults.rb'

           
    from
    /Users/arungupta/samples/jruby/test/helloworld/config/initializers/new_rails_defaults.rb:502:in
    `load'

           
    from
    /Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:502:in
    `load'

           
    from
    /Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:354:in
    `new_constants_in'

           
    from
    /Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:502:in
    `load'

           
    from
    /Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/initializer.rb:475:in
    `load_application_initializers'

            
    ... 8 levels...

           
    from
    /Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/rails-2.1.0/lib/commands/generate.rb:27:in
    `require'

           
    from
    /Users/arungupta/testbed/jruby-1.1.2/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
    `require'

           
    from script/generate:3



    So even though database access has been explicitly disabled, there are
    still references to ActiveRecord. So I had to explicitly disable them
    by changing the code in "config/initializers/new_rails_defaults.rb" as:


    cellpadding="2" cellspacing="2">
    style="font-weight: bold;">if defined?(ActiveRecord)

    # Include Active Record class name as root for JSON serialized output.

    ActiveRecord::Base.include_root_in_json = true



    # Store the full class name (including module namespace) in STI type
    column.

    ActiveRecord::Base.store_full_sti_class = true

    end



    and then the controller is easily generated as:


    cellpadding="2" cellspacing="2">
    ~/samples/jruby/test/helloworld
    >~/testbed/jruby-1.1.2/bin/jruby
    script/generate controller home index


    JRuby limited openssl loaded. gem install jruby-openssl for full
    support.

    http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL

          exists 
    app/controllers/

          exists 
    app/helpers/

          create 
    app/views/home

          exists 
    test/functional/

          create 
    app/controllers/home_controller.rb

          create 
    test/functional/home_controller_test.rb

          create 
    app/helpers/home_helper.rb

          create 
    app/views/home/index.html.erb
  3. Run your application using href="http://rubyforge.org/projects/glassfishgem/">GlassFish
    v3 gem as:


    cellpadding="2" cellspacing="2">
    ~/workspaces/glassfish-scripting/rails/v3/src/test/rails
    >~/testbed/jruby-1.1.2/bin/jruby
    -S glassfish_rails helloworld


    Jun 27, 2008 2:46:18 PM com.sun.enterprise.glassfish.bootstrap.ASMain
    main

    INFO: Launching GlassFish on HK2 platform

    Jun 27, 2008 2:46:18 PM
    com.sun.enterprise.glassfish.bootstrap.ASMainHK2 findDerbyClient

    INFO: Cannot find javadb client jar file, jdbc driver not available

    Jun 27, 2008 2:46:18 PM
    com.sun.enterprise.v3.services.impl.GrizzlyProxy start

    INFO: Listening on port 3000

    Jun 27, 2008 2:46:18 PM
    com.sun.enterprise.v3.services.impl.GrizzlyEmbeddedHttpConfigurator
    configureSSL

    WARNING: pewebcontainer.all_ssl_protocols_disabled

    Jun 27, 2008 2:46:18 PM
    com.sun.enterprise.v3.services.impl.GrizzlyEmbeddedHttpConfigurator
    configureSSL

    WARNING: pewebcontainer.all_ssl_ciphers_disabled

    Jun 27, 2008 2:46:19 PM
    com.sun.enterprise.v3.services.impl.GrizzlyProxy start

    INFO: Listening on port 3131

    Jun 27, 2008 2:46:19 PM
    com.sun.enterprise.v3.services.impl.GrizzlyProxy start

    INFO: Listening on port 3838

    Jun 27, 2008 2:46:19 PM
    com.sun.enterprise.v3.admin.adapter.AdminConsoleAdapter setContextRoot

    INFO: Admin Console Adapter: context root: /admin

    Jun 27, 2008 2:46:19 PM com.sun.grizzly.jruby.RailsAdapter
    startRubyRuntimePool

    INFO: Starting Rails instances

    Jun 27, 2008 2:46:24 PM  

    SEVERE: JRuby limited openssl loaded. gem install jruby-openssl for
    full support.

    http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL

    Jun 27, 2008 2:46:24 PM com.sun.grizzly.jruby.RubyObjectPool$1 run

    INFO: JRuby and Rails instance instantiation took : 5169ms

    Jun 27, 2008 2:46:24 PM org.glassfish.scripting.rails.RailsDeployer load

    INFO: Loading application helloworld at /

    Jun 27, 2008 2:46:24 PM com.sun.enterprise.v3.server.AppServerStartup
    run

    INFO: Glassfish v3 started in 6419 ms

    Jun 27, 2008 2:46:28 PM com.sun.grizzly.jruby.RailsAdapter$Logger log

    INFO: 
  4. Chapter
    9
    in Rails
    Manual
    explains how to test controllers. Modify
    "test/functional/home_controller_test.rb" as:


    cellpadding="2" cellspacing="2">
    style="font-weight: bold;">require 'home_controller'



    class HomeControllerTest < ActionController::TestCase

      def test_index

       
    get :index


       
    assert_response :success


      end



    end
  5. Run the test as:


    cellpadding="2" cellspacing="2">
    ~/workspaces/glassfish-scripting/rails/v3/src/test/rails/helloworld
    >~/testbed/jruby-1.1.2/bin/jruby
    -S rake test


    (in
    /Users/arungupta/workspaces/glassfish-scripting/rails/v3/src/test/rails/helloworld)

    /Users/arungupta/testbed/jruby-1.1.2/bin/jruby -Ilib:test
    "/Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/rake-0.8.1/lib/rake/rake_test_loader.rb"
     

    /Users/arungupta/testbed/jruby-1.1.2/bin/jruby -Ilib:test
    "/Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/rake-0.8.1/lib/rake/rake_test_loader.rb"
    "test/functional/home_controller_test.rb"

    JRuby limited openssl loaded. gem install jruby-openssl for full
    support.

    http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL

    Loaded suite
    /Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/rake-0.8.1/lib/rake/rake_test_loader

    Started

    .

    Finished in 0.308 seconds.



    1 tests, 1
    assertions, 0 failures, 0 errors


    /Users/arungupta/testbed/jruby-1.1.2/bin/jruby -Ilib:test
    "/Users/arungupta/testbed/jruby-1.1.2/lib/ruby/gems/1.8/gems/rake-0.8.1/lib/rake/rake_test_loader.rb" style="font-weight: bold;">


If you indeed are using database (which is the most common case anyway)
then you can load data using href="http://manuals.rubyonrails.com/read/chapter/26">Fixtures
and then Test
your Models
.



Keep adding controller and models and testing them!

Please leave suggestions on other TOTD (Tip Of The Day) that
you'd like to see.
A complete archive is available href="http://blogs.sun.com/arungupta/tags/totd">here.

Technorati: href="http://technorati.com/tag/rubyonrails">rubyonrails
jruby href="http://technorati.com/tag/ruby">ruby href="http://technorati.com/tag/glassfish">glassfish
totd

Related Topics >>