sinatraでrspecをautospecで使うメモ

最近sinatraを使い始めました。
rspecsinatraで使い始めるまで右往左往したのでその時のメモ
cucumberも使おうかと思ったけど、あれはお客さんに見せる事ができるテスト仕様だから美味しいんであって、個人の趣味プログラミングで、しかもsinatra使ってサックリとサイト作るには手軽さが損なわれる気がしたのでとりあえず保留。

sinatraをインストール

$ sudo gem install sinatra
$ sudo gem install rack

appを作成

$ mkdir myapp
$ cd myapp
$ touch app.rb

/myapp/app.rb

require "rubygems"
require "sinatra"

get '/' do 
 "hello"
end

get '/hoge' do 
"get params #{params[:huga]}"
end

rspecとかいろいろインストール

$ sudo gem install rspec
$ sudo gem install ZenTest
$ sudo gem install autotest
$ sudo gem install autotest-fsevent
$ sudo gem install rack-test
$ sudo gem install shotgun
  • rspec
    • 割愛
  • ZenTest
  • autotest
    • テストを自動で実行してくれる素敵ライブラリ
  • autotest-fsevent
    • ファイルを保存したタイミングでautotestを走らす
  • rack-test
    • rackアプリのテスト用メソッドが詰まっている
  • shotgun
    • ファイルを修正した後サーバを上げなおさなくても適応してくれる

config.ruを作る

$ touch config.ru

/myapp/config.ru

require 'app'
#set :environment, :production
set :environment, :development
run Sinatra::Application

shotgunでsinatraを起動

shotgun config.ru

config.ruを作らなくても

shotgun app.rb

でも動くみたい

.autotestの作成

自分のHomeフォルダに.autotestを作成
$HOME/.autotest

# -*- ruby -*-
require 'autotest/fsevent'

specの置き場所を作る

$ cd myapp
$ mkdir spec

specの設定ファイルとか作る

$ cd sepc
$ touch spec.opts
$ touch spec_helper.rb

/myapp/spec/spec.opts

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

/myapp/spec/spec_helper.rb

require File.join(File.dirname(__FILE__), '..', 'app.rb')

require 'rubygems'
require 'sinatra'
require 'rack/test'
require 'spec'
require 'spec/autorun'
require 'spec/interop/test'

set :environment, :test
set :run, false
set :raise_errors, true
set :logging, false

appのテスト用specを作る

$touch app_spec.rb
$ls
app_spec.rb    spec.opts      spec_helper.rb

/myapp/spec/app_spec.rb

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

describe "App" do
  include Rack::Test::Methods

  def app
    @app ||= Sinatra::Application
  end

  it "should respond to /" do
    get '/'
    last_response.should be_ok
  end
  it "should return the correct content-type when viewing root" do
    get '/'
    last_response.headers["Content-Type"].should == "text/html"
  end
  it "should return 404 when page cannot be found" do
    get '/404'
    last_response.status.should == 404
  end
  describe "hoge" do
    it "post "huga" do
      get "hoge", { :huga => 'piyo'}
      last_response.status.should == 200
      (last_response.body =~ /piyo/).should_not be_nil
    end
  end

end

autospecの実行

app.rbのある場所で以下のコマンド

$ autospec

とりあえずこんな感じで動くようになる。
あとRailsで使っていときのメソッドとは少し違ってきちゃうのでrak-testのメソッドを確認したほうが良いと思います。
http://gitrdoc.com/brynary/rack-test/tree/master

基本的に使うのは

  • get(uri, params = {}, env = {})
  • request(uri, env = {})
  • last_request
  • last_response
  • follow_redirect!
  • header(name, value)
  • authorize(username, password)

ぐらいかな。