2017-01-24 9 views
1

私は、多くの段落を持つPageというモデルを持っています。これはすべて動作しますが、私はいくつかのテストがあった頃だと思いました。理由のために、私は次の段落に番号を付ける方法を知っているので、ページにあるすべての段落の数を必要とします。これは私のモデルのcount_paragraphsメソッドで行います:rspecを使ってRailsでbelongs_to関係をテストする

class Page < ApplicationRecord 
    has_many :paragraphs 

    def count_paragraphs 
    paragraphs.count + 1 
    end 
end 

これまでのところ単純です。これは私のコントローラーでうまく動作し、次の段落を作成するために使用します。

@paragraph = @page.paragraphs.create(body: para_params[:body], num: @page.count_paragraphs) 

このようにすべてが動作します。しかし、テストでは、これは動作しません。

it 'has a paragraph count of 1' do 
    expect(subject.count_paragraphs).to eq 1 
end 

it 'successfully counts paragraphs' do 
    subject.paragraphs.new(body: "hello", num: 1) 
    expect(subject.count_paragraphs).to eq 2 
end 

最初のテストは成功し、2番目のテストは失敗します。それは常に1を返します。私がbinding.pryテストするとき、私はsubject.paragraphsを行う場合、新しい段落が表示されますが、私はバインディング。モデルでは、paragraphsはちょうど戻ってくる[]。だから私はモデル関係について何か誤解している。

ここで間違っていることを知っている人はいますか?文書によると

+0

メソッドを 'next_paragraph_number'と呼ぶべきではありませんか? – Stefan

+0

これははるかに良い名前です、はい –

答えて

0

countを行います。

は、SQLを使用してすべてのレコードをカウントします。

したがって、永続化されたレコードのみをカウントします。

代わりnewcreateを呼び出すことによってこれを実現できます。

subject.paragraphs.create(body: "hello", num: 1) 

それとも、また、メモリ内のオブジェクトをカウントsize代わりのcountを使用することもできます。

コレクションがいない場合にはロードされた場合は、SELECT COUNT(*)クエリを実行します。それ以外の場合はcollection.sizeとなります。

+0

これは正解です、ありがとう! –

+0

そのため、binding.pryをモデルに挿入するとき、 'paragraphs'は' [] 'を返すので、メモリ内で持続されていない段落を見る方法はありますか? –

+0

あなたのテストで 'subject.paragraphs.to_a.count'を使うことができます。 – fylooi

関連する問題