単一テーブル継承をテストするときの注意

Railsのテストで、ここしばらくはまっていた。というのも、継承関係にあるModelをテストしようとするとエラーがでて止まってしまうので、困っていた。

たとえば、アジャイル本第2版の例にあるような「Personモデル <= Customerモデル」の場合、Personのテーブルは実態があるけど、Customerはそれに対応したテーブルが無い。Personテーブルのtypeカラムにcustomerってかかれるだけだからだ。

でも、テストプログラムは以下のようにスケルトンが作られている

require File.dirname(__FILE__) + '/../test_helper'
class CustomerTest < Test::Unit::TestCase
  fixtures :customer
  # Replace this with your real tests.
  def test_truth
    assert true
  end
end

fixtureはファイル名とテーブル名が一致しないといけないので、テストを走らせると当然エラーで落ちる。ここで止まってた。

というのは、customerのfixtureを読み込ませないといけないと思いこんでいて、どうにかしたらmodelと同じようにtypeカラムに対応した形でテストが動いてくれないかと悩んでいた。

結果からいうと、そうではなくてテーブルの実態通りにあわせればいいだけだったみたい。

  fixtures :person

personのfixtureを読み込ませて、そのfixtureの内部データとしてtypeにcustomerとかかれているデータがあれば処理できることになる。

気がつくと凄く簡単なんだが、なぜかテストクラス名と対応したfixtureを読み込ませなくてはいけないと思っていて、はまりこんでいた。とりあえずこれでModelのテストがばりばりできるようになったので、いろいろ書いて試してみよう(というか、さっそく書けなかった数モデル分のテストを書いたらバグをぼろぼろ発見。やっぱりテスト大事ですね(苦笑))。