2016-11-29 9 views
1

私はいくつかの概念を試して苦労しています。私は、アイデアはモックとスタブを通じて分離で物事をテストすることであることを理解しかし、次に苦しんでいます:RSpec - 配列メソッドへのアクセス

class Circle 
    has_many :jobs 

    def accepted 
    jobs.where('sitter_id > 0') 
    end 
end 

class Job 
    belongs_to :circle 
end 

そして、私のRSpecの:

require 'rails_helper' 

RSpec.describe Circle, type: :model, focus: true do 

    let (:circle_1) { FactoryGirl.create(:circle, title: 'London', 
               location: 'London', 
               administrator_id: 1) } 

    let (:job_1) { FactoryGirl.create(:job, start_time: "2016-11-14 20:00:00", 
              end_time: "2016-11-14 23:00:00", 
              tokens_offered: 6, 
              requester_id: 1, 
              circle_id: 1, 
              sitter_id: 5, 
              actual_start_time: "2016-11-14 20:00:00", 
              actual_end_time: "2016-11-14 23:30:00", 
              tokens_paid: 7) } 

    before do 
    circle_1.stub(:jobs).and_return([job_1]) 
    end 

    describe 'instance methods' do 
    context 'accepted' do 
     it 'should return jobs with a sitter' do 
     expect(circle_1.accepted).to include(job_1) 
     end 
    end 
    end 
end 

これは、その結果:

NoMethodError: 
    undefined method `where' for #<Array:0x007feb4ae72858> 

配列のwhereメソッドの動作をスタブしますか?私が混乱していることは、確かに私がテストしていることです。スタブすることによって、コード自体をテストするのではなく、コードが何をしているのかを基本的にテストしていますか?

私がこの間違いを理解しているかどうか、誰かがどのようにテストを書き直すか、またはそれをどのようにして渡すことができるかを説明することができれば、非常に感謝しています。

+0

'circle_id:circle_1.id' - ' jobs'をスタブする必要はありません –

+0

circle_1.jobsを呼び出すときにジョブが返されていますが、RSpecはどのようにして配列から 'どこ'私はあなたが配列としてそれをスタブので、 – Mark

+0

を参照してください、私が提案し何を行うことができます;) –

答えて

0

問題は、ARコレクションを配列オブジェクトにスタブしたことです。もちろん、配列オブジェクトにはwhereメソッドがありません。

工場レベルで関連付けを行いたいとします。

circle_id: circle_1.id # in job_1 

これにより、ジョブのコレクションをスタブする必要がなくなり、テストが正常に機能します。

+0

のためのおかげで、私は配列をスタブ化アソシエーションは設定されていませんでしたが、あなたが説明したように、circle.jobsとは異なるオブジェクトが返されます。 IDが正しく設定されるようになりました。 – Mark

+0

@マークは、問題が解決した場合は、答えを受け入れるようにしてください(アンサースコアの近くのチェックマーク)。 –

関連する問題