Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Testing for the Camping micro-web-framework

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 lib
Octocat-spinner-32 public
Octocat-spinner-32 test
Octocat-spinner-32 .gitignore
Octocat-spinner-32 CHANGELOG
Octocat-spinner-32 MIT-LICENSE
Octocat-spinner-32 Manifest.txt
Octocat-spinner-32 README.txt
Octocat-spinner-32 Rakefile
Octocat-spinner-32 mosquito.gemspec
README.txt
=Mosquito, for Bug-Free Camping

A testing helper for those times when you go Camping.
Apply on the face, neck, and any exposed areas such as your 
Models and Controllers. Scrub gently, observe the results.

== Usage

Make a few files and directories like this:

  public/
    blog.rb
  test/
    test_blog.rb
    fixtures/
       blog_comments.yml
       blog_posts.yml
       blog_users.yml

Setup <b>test_blog.rb</b> like this:

  require 'rubygems'
  require 'mosquito'
  require File.dirname(__FILE__) + "/../public/blog"
  
  Blog.create
  include Blog::Models
  
  class TestBlog < Camping::WebTest
    
    fixtures :blog_posts, :blog_users, :blog_comments
    
    def setup
      super
      # Do other stuff here
    end
    
    test "should get index" do
      get
      assert_response :success
      assert_match_body %r!>blog<!
    end
    
    test "should get view" do
      get '/view/1'
      assert_response :success
      assert_kind_of Article, @assigns[:article]
      assert_match_body %r!The quick fox jumped over the lazy dog!
    end
    
    test "should change profile" do
      @request['SERVER_NAME'] = 'jonh.blogs.net'
      post '/change-profile', :new_photo => upload("picture.jpg")
      assert_response :success
      assert_match_body %r!The pic has been uploaded!
    end
  end

  # A unit test
  class TestPost < Camping::ModelTest

    fixtures :blog_posts, :blog_users, :blog_comments

    test "should create" do
      post = Post.create( :user_id => 1, 
                          :title => "Title", 
                          :body => "Body")
      assert post.valid?
    end

    test "should be associated with User" do
      post = Post.find :first
      assert_kind_of User, post.user
      assert_equal 1, post.user.id
    end

  end

You can also use old-school methods like <tt>def test_create</tt>, but we think this way is much more natural. 

Mosquito includes Jay Fields' <tt>dust</tt> gem for the nice <tt>test</tt> method which allows more descriptive test names and has the added benefit of detecting those times when you try to write two tests with the same name. Ruby will otherwise silently overwrite duplicate test names without warning, which can give a false sense of security.

== Details

Inherit from Camping::WebTest or Camping::ModelTest. If you define <tt>setup</tt>, 
be sure to call <tt>super</tt> so the parent class can do its thing.

You should also call the <tt>MyApp.create</tt> method if you have one, <b>yourself</b>. You will also
need to <tt>include MyApp::Models</tt> at the top of your test file if you want to use 
Models in your assertions directly (without going through MyApp::Models::SomeModel).

Make fixtures in <b>test/fixtures</b>. Remember that Camping models use the name of 
the mount plus the model name: <b>blog_posts</b> for the <b>Post</b> model.

See <b>blog_test.rb</b> for an example of both Web and Model tests.

Mosquito is one file, just like your app (right?), so feel free to ship it included with the app itself
to simplify testing.

== Warning: You are Camping, not Rail-riding

These directives are highly recommended when using Mosquito:

* Test files start with <b>test_</b> (test_blog.rb). Test classes start with <b>Test</b> (TestBlog).
* Model and Controller test classes can both go in the same file.
* The popular automated test runner <tt>autotest</tt> ships with a handler for Mosquito. Install the ZenTest gem and run the <tt>autotest</tt> command in the same folder as the <tt>public</tt> and <tt>test</tt> directories.
* A Sqlite3 :memory: database is automatically used for tests that require a database.

You can run your tests by executing the test file with Ruby or by running the autotest command with no arguments (from the ZenTest gem).

  ruby test/test_blog.rb
  
or
  
  autotest

== RSpec

Do you prefer RSpec syntax? You can get halfway there by putting this include in your test file:

  require 'spec/test_case_adapter'

Then you can use <tt>should</tt> and <tt>should_not</tt> on objects inside your tests.

== Authors

Geoffrey Grosenbach http://topfunky.com, with a supporting act 
from the little fairy http://julik.nl and the evil multipart generator
conceived by http://maxidoors.ru. 
Something went wrong with that request. Please try again.