2012-01-25 5 views
2

Rubyists、特にRailsersは、ActiveModel::Lintについて知っています。これは、ActiveModelサブクラスを書くときに覚悟していないことを確認するのに便利な方法です。 Railsプロジェクトでは、テーブルレスモデルのためにいつも使っています。ActiveRecordのリントはありますか?

しかし、私はActiveRecordを使用して、特に両面のアソシエーションでエラーを捜すのに多くの時間を費やしています。例では、誰の愚かなこととして、やや不自然であることを例

# app/models/blog.rb 
class Blog < ActiveRecord::Base 
    has_many :posts # so far so good... 
end 

# app/models/post.rb 
class Post < ActiveRecord::Base 
    has_one :blog # incorrect - should be belongs_to 
end 

ください。しかし、Blogに実際にpost_id列がある場合はどうなりますか?予想されるところでは例外は発生しません。

私はBlog

このよう
# test/unit/blog_test.rb 
require 'test/test_helper' 
class BlogTest < ActiveSupport::TestCase 
    include ActiveRecord::Lint 
end 

のためのテストを書くことができるようにしたい...とテスト出力はBlog :has_many :posts, but Post does not :belong_to :blog!のような何かを言う必要があります。それは、テーブル名、外部キーなどを扱い、考慮する必要があるでしょう:途中のモデルを介して、協会に反映する必要があります。私は、適切な単体テストは、とにかくこれらの問題を検出するが、一般的に他のテストの副作用として検出することを知っている。

これを行うプロジェクトを知っている人はいますか? (私はActiveRecord> = 3.1のみに興味があります)。私が見つけたのはactive_record_lintでしたが、実際にはこれはまったく行いません。

さらに、これらの厄介な関連が設定されていることを確認するために、既存のすべてのフィクスチャを自動的にテストすることができれば幸いです。私は通常やるだけです

test "fixtures" do 
    Post.all.each { |p| assert p.valid? "Fixture is broken! #{p.inspect}" } 
end 

しかし、確かによりエレガントな方法があります。

+0

工場の代わりに治具を使用する場合は、そうするようにテストすることをお勧めします。すべてが簡単に壊れた器具を作り、問題を追跡しようと時間を費やすのは簡単です。 – tadman

答えて

0

このようなツールは便利ですが、とにかくこれらのことを明示的にテストする必要があります。これはすぐにこのような問題を明らかにするでしょう。例えば、典型的なユニットテスト:あなたのポストのために

def test_defaults 
    blog = Blog.create(
    :title => 'Example Blog' 
) 

    assert blog.valid? 
    assert_equal [ ], blog.errors.full_messages 
    assert !blog.new_record? 

    assert_equal 0, blog.posts.count 
end 

def test_defaults 
    blog = Blog.create(
    :title => 'Example Blog' 
) 

    post = Post.create(
    :blog => blog, 
    :content => 'Blogging blog bloggers blogged blogs' 
) 

    assert post.valid? 
    assert_equal [ ], post.errors.full_messages 
    assert !post.new_record? 

    assert_equal blog.id, post.blog_id 
    assert_equal 1, blog.posts.count 
end 

それらは私が通常使用するいくつかのhelper methodsの長い形式のバージョンです。

あなたが関係を行使しない場合、あなたはそれらをテストしておらず、テストカバレッジに問題があります。あなたが悪い関係を行使すると、それはエラーとして表示されます。

+0

私は完全に同意しています。これは私が通常やっていることですが、test_helper.rbに 'assert_valid'を定義しています。私はカテゴリ':has_many(複数のモデル) 'が存在する現時点でかなり複雑な構造をしています。 'has_many:categorizables'と':has_many:other_models、:through =>:categorizables(余分なオプション) 'です。ヘルパーを使っていても、テストするのは悪夢で、繰り返しWET(What、Every Time?)を感じ始める。これらのテストはかなり標準化できるはずです。私は、誰かが会合をチェックする棚の宝石を作る時間をとっていたのか疑問に思っていました。そうでない場合、私は可能性があります。 – bjjb

+0

特定の関数は、使用するたびにテストするのではなく、さまざまなフォームで1回ずつテストすることを覚えておいてください。つまり、空の状態をチェックし、何かを追加したり、状態をチェックしたり、何かを削除したり、再度チェックしたりします。同じことを何度も何度も断言する必要はありません。 1つのテストが失敗してバッチエラーが発生した場合は、エラーを修正する可能性があるという前提で、失敗したテストを最初に修正します。 – tadman

関連する問題