完璧なテストには、テストフレームワークとテスト対象のクラスだけが含まれていると言われています。他のすべては嘲笑されるべきです。それでは、団体はどうですか?レールアソシエーションのスペックを書くには?
そして私は簡単なことを意味するわけではありません。has_many
、belongs_to
アソシエーションですが、関連付けの拡張子とスコープです。私は実際にスコープのスペックを書こうと思っていますが、それをどうやって行うのか分かりません。
完璧なテストには、テストフレームワークとテスト対象のクラスだけが含まれていると言われています。他のすべては嘲笑されるべきです。それでは、団体はどうですか?レールアソシエーションのスペックを書くには?
そして私は簡単なことを意味するわけではありません。has_many
、belongs_to
アソシエーションですが、関連付けの拡張子とスコープです。私は実際にスコープのスペックを書こうと思っていますが、それをどうやって行うのか分かりません。
私もこれに巻き込まれました。 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
しかし、今、あなたのUser
にPost
とLocation
モデルをテストしている:モデルの仕様(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
などがあるだろう。ある時点で、関連付けが保存されており、照会可能であることを実際にテストする必要があります。それはここにある。モデル仕様では、属性の「単体テスト」と関連の「統合テスト」があると考えてください。
非常に良い説明、ありがとうございます!私はあなたがモデルに持っている関連の部分をテストする(ユーザ - >コメント==テスト、ユーザオブジェクトのパースペクティブから作成する、取得する、削除する)ことを追加したいと思います。 'ActiveRecord'が動作するのではなく、あなたの' ActiveRecord'の使用が動作することだけをテストしてください。 – mliebelt
私はそれに "自分で書くコードをテストする"を追加します。あなたのモデルクラスが関連付けを伴って行う唯一のことがそれを定義することであれば、関連が定義されていることを確認するだけで十分です(例えば、フィクスチャでhas_many配列にアクセスできることを確認することで)。メソッドがhas_many#buildを呼び出す場合、has_manyの#build機能ではなくメソッドをテストします。私のモデルは、「投稿」がx、y、zを行うことができるので、私はそれがx、y、zを行うことができることをテストしなければならないという保証を提供しています。オプションの組み合わせは、あなたのコードをテストするためのあなたのコードとしてカウントされます –