モデルの単体テスト

ユニットテストの作成方針

  • DBに対して、期待通りの操作が行なえているかどうかを検証する。
  • モデルの全メソッドを網羅する。
  • デルの1メソッドに対して、最低1つ以上のテストメソッドを書く。
  • モデルの1メソッドが、大きく異なった複数の振る舞いをする場合、それぞれの振る舞いに対して個別にテストメソッドを書く。
    • この場合モデルの1メソッドをリファクタリングして複数メソッドに分割した方がより良い。なぜなら、どういう基準でテストメソッドを分割しているのか余計な説明が必要になってしまうからである。
  • モデルメソッド以外に,モデルのバリデーションルールなどの個々の性質・挙動もテストコード作成対象にしてよい。

具体的なテストの記述方法

  • Test::Unitを使う。(Ruby on Railsに特化したテスト方法ではない)
    • assert系のメソッド一覧:
      • assert( hoge ) : hogeがtrueであることを要求
      • assert_equal( expected, actual ) : expected == actualであることを要求
      • assert_not_equal( expected, actual ) : expected != actualであることを要求
      • flunk( メッセージ ) : 常に失敗

ほかのテストメソッドは上記の応用で済ませる事が可能

参考:http://www.ruby-lang.org/ja/man/html/Test_Unit.html#Test.3a.3aUnit.3a.3aAssertions

  • テスト対象が参照系のメソッドの場合
    • そのメソッドを使って,現在のDB内容を読み込む。
    • 返り値が期待通りの構造+内容かどうかをassertで検証。

  • テスト対象が更新系のメソッドの場合
    • そのメソッドを使って,DBの状態を変更する。
    • 参照系のメソッド(※find(:all)のような基本的なメソッド)を使って、現在のDB内容を読み込む。
    • 返り値が,期待通りの構造+内容かどうかをassertで検証。
  • テスト対象がその他のモデルの性質の場合
    • newでモデルのインスタンスを作成する。
    • そのモデルオブジェクトそのものを操作する。(アソシエーション設定など)
    • その後に、モデルオブジェクトが期待通りの性質を持っているかどうかをassertで検証。
確認事項
    • setup()内に共通の事前処理を書ける。
    • テーブル名( :フィクスチャ名 ) で、フィクスチャデータ内の特定のレコードをActiveRecordとして参照できる。