第5回 機能テスト
2008/01/19
今回は、前回のテンプレートファイルの拡張子でコントローラを生成した際の副産物である機能テストについて。
test/functional/top_controller_test.rb
の中身はこんな風になっています。
require File.dirname(__FILE__) + '/../test_helper' class TopControllerTest < ActionController::TestCase # Replace this with your real tests. def test_truth assert true end end
1.2.x の時にできた機能テストと比べて随分すっきりしています。かつては、初期状態で次のようになっていました。
require File.dirname(__FILE__) + '/../test_helper' require 'top_controller' # Re-raise errors caught by the controller. class TopController; def rescue_action(e) raise e end; end class TopControllerTest < Test::Unit::TestCase def setup @controller = TopController.new @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new end # Replace this with your real tests. def test_truth assert true end end
top_controller
を require したり、TopController
を new したりといったコードは、すべての機能テストに共通のもので、ほとんど書き換えられる可能性がありません。こういうものをジェネレータに作らせるのは、DRY の原則に反します。Rails 2.0 は正しい方向に進化しているようです。
では、簡単なテスト駆動開発をやってみましょう。
require File.dirname(__FILE__) + '/../test_helper' class TopControllerTest < ActionController::TestCase def test_index get :index assert_response :success message = assigns(:message) assert_equal 'Hello World!', message assert_template 'top/index' assert_select 'title', 'Greeting' end end
テストを実行します。
ruby test/functional/top_controller_test.rb
予想通り、エラーが出ます。
Loaded suite test/functional/top_controller_test Started F Finished in 0.143769 seconds. 1) Failure: test_index(TopControllerTest) [test/functional/top_controller_test.rb:8:in `test_index' /usr/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/testing/default.rb:7:in `run']: <"Hello World!"> expected but was <nil>. 1 tests, 2 assertions, 1 failures, 0 errors
インスタンス変数 @message
に正しい値が入るように top_controller.rb
を書き換えます。
class TopController < ApplicationController def index @message = 'Hello World!' end end
また、app/views/layout/application.html.erb を次のように書き換えます。
<html> <head> <title>Greeting</title> </head> (以下、略)
テストを実行すると、今度は通ります。
Loaded suite test/functional/top_controller_test Started . Finished in 0.067353 seconds. 1 tests, 4 assertions, 0 failures, 0 errors
なかなか、いい感じです。今日はここまでとしましょう。