2011-09-16 10 views
1

完璧なテストには、テストフレームワークとテスト対象のクラスだけが含まれていると言われています。他のすべては嘲笑されるべきです。それでは、団体はどうですか?レールアソシエーションのスペックを書くには?

そして私は簡単なことを意味するわけではありません。has_manybelongs_toアソシエーションですが、関連付けの拡張子とスコープです。私は実際にスコープのスペックを書こうと思っていますが、それをどうやって行うのか分かりません。

答えて

1

私もこれに巻き込まれました。 Rspecでは、彼らは "ユニットテスト"のアイデアを取り除きます。実際には、Railsの単体テストは、少なくとも私にとって、モデルの属性値をテストすることを意味します。しかし、あなたは正しいのですが、団体はどうですか?

Rspecでは、spec/modelsディレクトリを作成し、モデルをテストします。

require 'spec_helper' 

describe User do 
    context ":name" do 
    it "should have a first name" 
    it "should have a last name" 
    end 

    # all tests related to the gender attribute 
    context ":gender" do 
    it "should validate gender" 
    end 

    # all tests related to "belongs_to :location" 
    context ":location" do 
    it "should :belong_to a location" 
    it "should validate the location" 
    end 

    # all tests related to "has_many :posts" 
    context ":posts" do 
    it "should be able to create a post" 
    it "should be able to create several posts" 
    it "should be able to list most recent posts" 
    end 
end 

しかし、今、あなたのUserPostLocationモデルをテストしている:モデルの仕様(spec/models/user_spec.rb)の上部には、あなたのユニットテストを(自分の属性をテスト)、その後、あなたは以下の各関連をテストしていテスト?うんしかし、Postモデルでは、ユーザーに関連して行われていること以外の余分なものがあります。 Locationと同じです。その

require 'spec_helper' 

describe Location do 
    context ":city" do 
    it "should have a valid city" 
    end 

    context ":geo" do 
    it "should validate geo coordinates" 
    end 
end 

なし私の意見では欺かれてはならない。だから、spec/models/location_spec.rbなどがあるだろう。ある時点で、関連付けが保存されており、照会可能であることを実際にテストする必要があります。それはここにある。モデル仕様では、属性の「単体テスト」と関連の「統合テスト」があると考えてください。

+1

非常に良い説明、ありがとうございます!私はあなたがモデルに持っている関連の部分をテストする(ユーザ - >コメント==テスト、ユーザオブジェクトのパースペクティブから作成する、取得する、削除する)ことを追加したいと思います。 'ActiveRecord'が動作するのではなく、あなたの' ActiveRecord'の使用が動作することだけをテストしてください。 – mliebelt

+0

私はそれに "自分で書くコードをテストする"を追加します。あなたのモデルクラスが関連付けを伴って行う唯一のことがそれを定義することであれば、関連が定義されていることを確認するだけで十分です(例えば、フィクスチャでhas_many配列にアクセスできることを確認することで)。メソッドがhas_many#buildを呼び出す場合、has_manyの#build機能ではなくメソッドをテストします。私のモデルは、「投稿」がx、y、zを行うことができるので、私はそれがx、y、zを行うことができることをテストしなければならないという保証を提供しています。オプションの組み合わせは、あなたのコードをテストするためのあなたのコードとしてカウントされます –

関連する問題