先日作成したSinatraのテンプレートにwycats’s bundler at master – GitHubを導入してみた。
まず、SinatraアプリをSinatra::Baseを継承したクラス化。
アプリルートにGemfileファイルを以下の内容で作成。
gem "sinatra", "0.9.4", :require_as => "sinatra/base" gem "rack", "1.0.1" gem "rack-flash", "0.1.1", :require_as => "rack/flash" gem "haml", "2.2.13" gem "chriseppstein-compass", "0.8.17", :require_as => "compass" gem "dm-core", "0.10.1" |
アプリルートのgemsにバンドルを保存して、利用するgemを記述。
app.rbの先頭のsinatraなどのrequireを削除して以下を追加。
require File.expand_path(File.join(File.dirname(__FILE__), 'vendor', 'gems', 'environment')) Bundler.require_env |
アプリルートで
$ gem bundle |
を実行して、利用するgemをダウンロードして環境を作成します。
デフォルトではvender/gemsにダウンロードされて、実行ファイルはbinに配置される。変更可能。
で、
$ ruby app.rb |
すると、これまでと変わらずsinatraアプリが実行される。
テストでのみ利用するgemはGemfileに
only :test do gem 'shoulda', "2.10.2" gem 'rack-test', "0.5.2", :require_as => "rack/test" end |
アプリをクラス化したのでテストも書き換え。
test/test_helper.rbを作って
require File.join(File.dirname(__FILE__), '..', 'app.rb') require 'test/unit' require File.expand_path(File.join(APP_ROOT, 'vendor', 'gems', 'environment')) Bundler.require_env :test module TestHelper include Rack::Test::Methods def app SinatraApp end end Test::Unit::TestCase.send(:include, TestHelper) |
test/app_test.rbを下記に変更。
require File.dirname(__FILE__) + '/test_helper' class AppTest < Test::Unit::TestCase context "Access pages" do should "show index" do get '/' assert_match 'Say hello!', last_response.body end should "show hello" do post '/hello' follow_redirect! assert_match 'Hello world!', last_response.body end end end |
features/support/env.rb
# -*- encoding: UTF-8 -*- require File.join(File.dirname(__FILE__), '../../app.rb') require File.expand_path(File.join(APP_ROOT, 'vendor', 'gems', 'environment')) Bundler.require_env :test require 'test/unit/assertions' Encoding.default_external = 'UTF-8' Webrat.configure do |config| config.mode = :rack config.application_framework = :sinatra config.application_port = 4567 end World(Test::Unit::Assertions) do def app SinatraApp end include Rack::Test::Methods include Webrat::Methods include Webrat::Matchers end Before do DataMapper.auto_migrate! end |