私はテストに不慣れで、Railsですが、TDDプロセスを適切に停止しようとしています。
Has_many:throughリレーションシップをテストするために何らかのパラダイムを使用するかどうか疑問に思いました。 (または、一般的にはhas_manyだけだと思います)。
たとえば、モデルの仕様では、関連するメソッドの関係の両端をチェックするための簡単なテストを確実に作成していることがわかりました。
すなわち:
require 'spec_helper'
describe Post do
before(:each) do
@attr = { :subject => "f00 Post Subject", :content => "8ar Post Body Content" }
end
describe "validations" do
...
end
describe "categorized posts" do
before(:each) do
@post = Post.create!(@attr)
end
it "should have a categories method" do
@post.should respond_to(:categories)
end
end
end
次に、私のカテゴリ仕様で、逆テストを実行し、@ category.postsを確認します
他に何が欠けていますか?ありがとう!
Shoulda という宝石をチェックすることをお勧めします。関係や検証などをテストするためのマクロがたくさんあります。
Has_many関係が存在することをテストするだけの場合は、次のようにすることができます。
describe Post do
it { should have_many(:categories) }
end
または、has_many:throughをテストしている場合は、次を使用します。
describe Post do
it { should have_many(:categories).through(:other_model) }
end
Shoulda Rdoc ページも非常に役立ちます。
describe "when Book.new is called" do
before(:each) do
@book = Book.new
end
#otm
it "should be ok with an associated publisher" do
@book.publisher = Publisher.new
@book.should have(:no).errors_on(:publisher)
end
it "should have an associated publisher" do
@book.should have_at_least(1).error_on(:publisher)
end
#mtm
it "should be ok with at least one associated author" do
@book.authors.build
@book.should have(:no).errors_on(:authors)
end
it "should have at least one associated author" do
@book.should have_at_least(1).error_on(:authors)
end
end
注目に値する これはうまくいきます:
describe Pricing do
should_have_many :accounts, :through => :account_pricings
should_have_many :account_pricings
should_have_many :job_profiles, :through => :job_profile_pricings
should_have_many :job_profile_pricings
end
通常、モデルから仕様にすべての関係をコピーし、「has」を「should_have」に、「belongs_to」を「should_belong_to」に変更するだけです。 Railsをテストしているという非難に答えるために、データベースもチェックして、関連付けが機能していることを確認します。
検証をチェックするためのマクロも含まれています。
should_validate_numericality_of :amount, :greater_than_or_equal_to => 0
完全を期すために、2020年には追加の宝石なしでこれが可能です。
it "has many categories" do
should respond_to(:categories)
end
そしてさらに明確に:
it "belongs to category" do
t = Post.reflect_on_association(:category)
expect(t.macro).to eq(:belongs_to)
end
( ReflectionのRuby API を参照)
2番目の例では、「has_one」が「belongs_to」と混同されないようにします。その逆も同様です。
ただし、これはhas_many:through関係に限定されるものではなく、モデルに適用される任意の関連付けに使用できます。
(注:これは 新しいrspec 2.11構文 with Rails 5.2.4)を使用しています