web-dev-qa-db-ja.com

Rails has_manyのRSpecテスト:スルーリレーションシップ

私はテストに不慣れで、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を確認します

他に何が欠けていますか?ありがとう!

25
Mario Zigliotto

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 ページも非常に役立ちます。

60
Peter Brown
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
2
GregC

注目に値する これはうまくいきます:

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
1
Wayne Conrad

完全を期すために、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)を使用しています

0
randmin