テストデータを作ってテストする
testデータベースは毎回リセットされる
動作確認をしていると、あらかじめデータベースにその動きを確認するのに都合の良いデータを登録しておきたい場合もある。Railsのテスト環境では、test/fixturesフォルダ以下にテーブル名(複数形).yml、まはたテーブル名(複数形).csvという命名規則でファイルを保存しておけば、テスト起動時に、そのファイルの内容通りにデータベースを設定してくれるようだ。この仕組みによって、testデータベースは常に同じ内容にリセットされ、毎回同じ条件でテストすることが可能になる。
- 初期状態では、以下のようなテストデータが自動生成されている。
# test/fixtures/slips.yml # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html one: number: 1 executed_on: MyString total_yen: 1 two: number: 1 executed_on: MyString total_yen: 1
- よって、前回rake test:unitsを実行した直後は、testデータベースのslipsテーブルは以下の内容にリセットされていたのだ。
sqlite> select * from slips; id number executed_on total_yen created_at updated_at ------------ ------------ ------------ ------------ -------------------- -------------------- 953125641 1 MyString 1 2008-03-02 17:50:37 2008-03-02 17:50:37 996332877 1 MyString 1 2008-03-02 17:50:37 2008-03-02 17:50:37
- idを指定していない為なのか、通常では考えられない値になってしまっているが...。
- idも含めてテストデータを設定するようにしてみると...
id, number, executed_on, total_yen 1, 1, 3/1, 1000 2, 2, 3/2, 2000
- idも指定した通りの内容でデータベースがリセットされた。
sqlite> select * from slips; id number executed_on total_yen created_at updated_at ------------ ------------ ------------ ------------ -------------------- -------------------- 1 1 3/1 1000 2008-03-02 18:03:33 2008-03-02 18:03:33 2 2 3/2 2000 2008-03-02 18:03:33 2008-03-02 18:03:33
.ymlファイルの便利な使い方
- slips.ymlファイルで以下のよう設定しておくと...
# test/fixtures/slips.yml # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html one: id: 1 number: 1 executed_on: 3/1 total_yen: 1000 two: id: 2 number: 2 executed_on: 3/2 total_yen: 2000
-
-
- yamlにおいては、コロン「:」直後の半角スペースは重要な意味を持つ。省略することは出来ない。
-
- テストコードの中で、以下のように活用することができる。(ここではslips(:one)が何なのかを確認する為のテストコードになっている。)
require File.dirname(__FILE__) + '/../test_helper' class SlipTest < ActiveSupport::TestCase # Replace this with your real tests. def test_truth assert true end def test_yaml assert_equal slips(:one), Slip.find(1), "yamlの:oneと、idが1のオブジェクトは同一のはず。" end end
- assert_equalメソッドは、引数1(slips(:one))と引数2(Slip.find(1))が等しいことをテストする。異なっているとfailuresに件数が報告され、引数3のメッセージも表示される。
- 等しくないことをテストするassert_not_equalメソッドもある。
- テストを実行すると以下のように成功した。slips(:one) = Slip.find(1)ということのようだ。
- このことが、どんな時に便利か考えてみた。つまり、.ymlファイルを利用すれば、レコードに分かり易い名前を付けて管理することができるのだ。どのサンプルを使ってテストしているのか明確になり、テストコードが読み易くなると思う。
$ rake test:units (in /Users/zari/railsapp/test_slip202) /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -Ilib:test "/Library/Ruby/Gems/1.8/gems/rake-0.8.1/lib/rake/rake_test_loader.rb" "test/unit/slip_test.rb" Loaded suite /Library/Ruby/Gems/1.8/gems/rake-0.8.1/lib/rake/rake_test_loader Started .. Finished in 0.110645 seconds. 2 tests, 2 assertions, 0 failures, 0 errors