テストは開発における一つの重要な要素です。変更をする度にテストを実行して確認しておくことで、意図しない動作の早期発見、品質保持につながります。
Railsはこの手法をサポートしており、rails generate something
などとした時、目的のものと同時にtestファイルも作られます。
コードを書く際にテストを先に書き、それを満足するコードを書いていく開発手法をTDD(Test Driven Development) といい、作るべきもの・条件の明確化、仕様に関する理解や間違いの早期発見が可能になるなどのメリットがあります。
assert について理解し、簡単なテストを一つ実行してみましょう。
テストをする際、ある想定される行動やデータが必要ですが、データベースのデータからその時々にランダムで抽出していては、テストが充分に機能するかわかりません。そのため、テスト用のデータをFixtureとして用意しておくことができます。
Fixtureはモデルごとに用意し、/test/fixtures/以下に modelname.yml のように保存します。
そして
fixt1: name: fixture1 description: This is the first fixture. img_url: something.jpg price: 9.99
のように書くと、テストスクリプトから
@item = items(:fixt1)
のように呼び出すことができます。
同様に3つのFixtureを作り、テスト内でpry(#3で紹介しました) して確認してください。
コントローラーのテストではコントローラーが適切なアクションを呼び出し、そのアクション、すなわちHTTPリクエスト・ステータスやCRUD等の実行結果などを検証します。
例えば、インデックスページを呼び出すテストは
test "get index test" do get items_url assert_response :success end
以上のようになり、
rails test
と実行すると、assertionが得られると思います。
CRUDについてのテストを書き、実行してみましょう。
モデルには入力に関するバリデーションをするコードが既にapp/models
内に書いてありますが、assertionによって確認ができるメリットがあるので、書いておく価値があります。
モデルのテストでは、バリデーションを通ることと同時に通らないべきデータを作成し、それが通らないことを確認することも必要になります。
例えば、
item = Item.new( name:"Name", description: "yyy", price: 20, img_url: "zzz.rb")
このように書いた時、
assert item.invalid?
のように、invalid?
がtrueになる(このitemはデータベースに保存できないと判断される)と期待できます。
・値段が-1, 0, 1 の時それぞれに関してのテストを書いてください。
・重複した名前のアイテムが登録されないことを確認するテストを書いてください。
・表示されたページにサイドバー、フッターが含まれているか確認するテストを書いてください。