Ruby2.3のbundler環境でsinatraをminitestするための下準備
Sinatraをテストするための情報収集をしているのですが、古い情報そのままだと動きません。
なので、いくつかメモ的に情報を残していきます。
前提
2016/9/4 に検証
環境は以下のとおり
- rbenv 1.0.0
- Ruby 2.3.1
- bundler 1.12.5
手順
- 適当なディレクトリを作る
bundle init
- Gemfileを編集
bundle install
- アプリケーションを書く
- テストを書く
- テストを実行する
Gemfile
以下をGemfileに追記
Gemfile
gem "sinatra"
gem "minitest"
gem "rack-test"
minitestは標準ライブラリとしてインストールされていますが、bundler環境では標準ライブラリを無視するっぽいので明示的にインストール
rackアプリをテストするためのツールはrackに入っていると思いきや、結構昔にrack-testに切り出されているらしいので、rack-testをインストールしてあげます。
以下を実行すると
bundle install --path=vendor/bundle
以下の様な、Gemfile.lockが生成されました。
Gemfile.lock
GEM
remote: https://rubygems.org/
specs:
minitest (5.9.0)
rack (1.6.4)
rack-protection (1.5.3)
rack
rack-test (0.6.3)
rack (>= 1.0)
sinatra (1.4.7)
rack (~> 1.5)
rack-protection (~> 1.4)
tilt (>= 1.3, < 3)
tilt (2.0.5)
PLATFORMS
ruby
DEPENDENCIES
minitest
rack-test
sinatra
BUNDLED WITH
1.12.5
テスト対象のアプリ
app.rbに対して以下を記述
app.rb
require "sinatra"
get "/" do
"Hello World"
end
テストファイルのテンプレート
test_app.rbに以下を記述
test_app.rb
require './app'
# require "test/unit" <- 今回はminitestを使うのでコメントアウト
require 'minitest/autorun'
require 'rack/test'
ENV['RACK_ENV'] = 'test'
# class HelloWorldTest < MiniTest::Unit::TestCase <- こいつだと動くけど警告が出る
class HelloWorldTest < MiniTest::Test
include Rack::Test::Methods
def app
Sinatra::Application
end
def test_it_says_hello_world
get '/'
assert last_response.ok?
assert_equal 'Hello World', last_response.body
end
end
実行
以下を実行すると
bundle exec ruby test_app.rb
以下のように標準出力される
Run options: --seed 15648
# Running:
.
Finished in 0.015177s, 65.8913 runs/s, 131.7825 assertions/s.
1 runs, 2 assertions, 0 failures, 0 errors, 0 skips