Railsのモデルを,簡単に単体テストしよう (フィクスチャを使わない,気軽なテストバッチ)
Ruby on RailsでのWebアプリ開発では,何もかも「レール」が敷かれていて便利。
しかし「そのレールはいらない」という時もある。
レールが,かえって足かせになるのだ。
その一例が,単体テストのテストデータ(フィクスチャ)の面倒くささ。
Ruby on Railsのfixturesを,Excelから生成しよう (テストデータを管理しやすくするためのマクロ)
http://language-and-engineering.hatenablog.jp/entry/20091215/p1
Ruby on Railsのテストの書き方 (モデルの単体テストと,コントローラの機能テスト)
http://language-and-engineering.hatenablog.jp/entry/20091023/p1
フィクスチャを捨てよう。
以下では,
- フィクスチャ不要
- テストケースは好きな場所においてよい
- テスト対象は,1バッチにつき1モデルのみ(複数でもよい)
のテスト方法。 Test::Unit の原点に戻っただけ,だが。
(1)テスト起動バッチ
まず,テストを開始して繰り返すためのバッチ。
あるモデルのテスト.bat
@rem 環境を定義 set RAILS_ROOT=D:\dev\rails\ set TESTCASE_FILE=D:\dev\scripts\test_my_model.rb :start cls @rem テストを実行 cd %RAILS_ROOT% ruby script/runner "eval(IO.readlines('%TESTCASE_FILE%').join)" @echo. @echo. @rem 再実行するか判定 @set userkey= @set /p userkey=もう一度実行(rを押下)/ 終了(それ以外のキー)? @if not '%userkey%'=='' set userkey=%userkey:~0,1% @if '%userkey%'=='r' goto start
バッチからRubyのコードを実行するための参考:
RailsアプリでActiveRecordを使ったバッチ処理 その2
http://brass.to/blog/rails_batch_2.html
- railsのバッチ処理の内容を別ファイルから読み込みたい場合
(2)テストケース
次に,テストケースを書くRubyクラス。
バッチから呼び出される。
test_my_model.rb
require 'test/unit' class MyModelTest < Test::Unit::TestCase # funcxという関数のテスト def test_funcx [ [ 1, 1, 2 ], [ 1, 2, 3 ], [ 2, 2, 4 ] # ここにテストデータを書き足してゆく ].each{|data_arr| arg1 = data_arr[0] arg2 = data_arr[1] expected_result = data_arr[2] # railsのモデルを呼んでテストできる real_result = MyModel.funcx( arg1, arg2 ) assert_equal( expected_result, real_result, "funcx( #{ arg1 }, #{ arg2 } ) should be #{ expected_result }" ) } end # funcyという関数のテスト def test_funcy # ... end end
参考:
Test::Unit
http://www.ruby-lang.org/ja/man/html/...