Shows how to:
\* Setup session
\* Sign in users
\* Prevent http traffic with FakeWeb
\* Keep the database clean with DatabaseCleaner
\* Use FactoryGirl factories
\* Stub methods
\* Use functional tests with Rack::Test and Webrat
\* Set HTTP headers
test/test\_helper.rb:
```ruby
require "rack/test"
require 'faker'
require 'fakeweb'
require 'mocha'
require "webrat"
require "test/unit"
require "factory_girl"
require "database_cleaner"
require "minitest/mock"
require 'minitest/spec'
require "minitest/pride"
ENV['RACK_ENV'] = 'test'
require_relative '../app'
require_relative 'factories'
FakeWeb.allow_net_connect = false
Webrat.configure do |config|
config.mode = :rack
end
DatabaseCleaner.strategy = :truncation
class FunctionalTest < Test::Unit::TestCase
include Rack::Test::Methods
include Webrat::Matchers
include Webrat::Methods
# Automate stuff
def app
self.class.name.sub(/Test$/, '').constantize
end
def setup
DatabaseCleaner.start
super
end
def teardown
DatabaseCleaner.clean
super
end
# Setup session before test.
#
# From https://gist.github.com/1118304
def setup_session(data = {})
sid = SecureRandom.hex(32)
hsh = data.merge("session_id" => sid)
data = [Marshal.dump(hsh)].pack('m')
secret = app.session_secret
hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA1.new, secret, data)
str = "#{data}--#{hmac}"
set_cookie("rack.session=#{URI.encode_www_form_component(str)}")
end
def sign_in(options = {})
@user = FactoryGirl.create(:user)
User.stubs(:find).returns(@user)
setup_session user_id: @user.id
# Set an HTTP header
#current_session.header key.to_s, value
end
end
class MiniTest::Spec
before :each do
DatabaseCleaner.start
end
after :each do
DatabaseCleaner.clean
end
end
```
And here's an example of a test:
```ruby
require_relative './test_helper'
class UsersControllerTest < FunctionalTest
# Not needed see test_helper.rb
def app
# Don't f**ing write UsersController.new or you will get weird errors if you try to touch your app's private parts
UsersController
end
def setup
sign_in
end
def test_something
params = { user: { email: 'jebuslocalhost', password: 'jebus', password_confirmation: 'jebus' } }
post '/new', params
assert_have_selector '.error-message'
assert last_response.ok?
end
end
```
Guardfile:
```ruby
# More info at https://github.com/guard/guard#readme
guard 'bundler'
guard 'minitest' do
# Specs
watch(%r|^spec/(.*)_spec\.rb|)
watch(%r|^spec/spec_helper\.rb|) { "spec" }
# Code
watch(%r|^app/(.*)\.rb|) { |m| "spec/app/#{m[1]}_spec.rb" }
watch(%r|^lib/(.*)\.rb|) { |m| "spec/lib/#{m[1]}_spec.rb" }
end
```