RubyOnRailsの標準テストをやってみる
標準テストなのかどうかは定かじゃないのですが、RSpecじゃなくてActiveSupport::TestCase/ActionController::TestCaseとかを使って単体テストとかやってみた。あくまで「どう使うのか」っていうのがポイントなんでコード上は特に意味の無い内容になってますんで
ちなみにベースは某イベントで開催されたRailsなLTの物をベースとされたのを参加者が自身で起こした物な模様
app/controllers/sample_controller.rb
class SampleController < ApplicationController
def index
render :text => "hoge"
end
def show
@target_id = params[:id]
respond_to do |format|
format.html {
render :text => @target_id
}
format.json {
render json: { id: @target_id }
}
end
end
end
app/models/sample_model.rb
class SampleModel < ActiveRecord::Base
attr_accessible :name
end
app/helpers/sample_helper.rb
module SampleHelper
def hoge
return SampleModel.find_by_name("hoge")
end
end
んじゃ、ここまで書いたのをテストする
test/fixtures/sample_models.yml
テスト時に投入されるデータをYAMLで定義すれば良い模様
one:
name: hoge
two:
name: fuga
three:
name: foobar
test/unit/sample_model_test.rb
require "test_helper"
class SampleModelTestCase < ActiveSupport::TestCase
setup do
puts "SampleModelTestCase.setup"
end
test "hoge entry exists test" do
assert_not_nil SampleModel.find_by_name("hoge")
end
end
まぁ特にモデルにメソッドを実装したりしてないので(ry
test/unit/helper/sample_helper_test.rb
require "test_helper"
class SampleHelperTestCase < ActiveSupport::TestCase
include SampleHelper
test "hoge helper test" do
entry = hoge()
assert_not_nil entry
assert_equal entry.name, "hoge"
end
end
ヘルパーテストのやり方あってるかは微妙なんすけど、とりあえずincludeしちゃって(ry
test/functional/sample_controller_test.rb
require "test_helper"
require "json"
class SampleControllerTest < ActionController::TestCase
#tests SampleController
test "get index" do
get :index
assert_response :success
assert_equal @response.body, "hoge"
end
test "get show" do
get :show, id: 1
assert_response :success
assert_not_nil assigns(:target_id)
assert_equal @response.body, "1"
end
test "get show(format json) test" do
get :show, id: 1, format: "json"
assert_response :success
assert_equal @response.content_type, "application/json"
data = JSON.parse(@response.body)
assert_not_nil(data)
assert_equal data["id"], "1"
end
test "get show(accept json) test" do
@request.accept = "application/json"
get :show, id: 1
assert_response :success
assert_equal @response.content_type, "application/json"
data = JSON.parse(@response.body)
assert_not_nil data
assert_equal data["id"], "1"
end
end
でコントローラーのテスト。respond_to等で処理される形式によりレスポンスを変えたりする場合には、:formatを指定するかrequest.acceptを変えてリクエストする事でそれに適したレスポンスが返ってくる模様