2016-11-29 77 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' - 並且不需要存根'作業' –

+0

調用circle_1.jobs時返回該作業,它只是RSpec不知道如何從數組中調用'where'我可以看到 – Mark

+0

因爲你存根它爲陣,做什麼我建議) –

回答

0

問題是,你將AR集合存入數組對象,當然這個方法沒有where方法。

您想要在工廠級別建立關聯。你可以用它來實現它

circle_id: circle_1.id # in job_1 

有了這個,你不必存根工作的集合,你的測試將按預期工作。

+0

我掐滅數組因爲關聯沒有設置 - 但是正如你所解釋的那樣,從circle.jobs返回一個不同的對象。現在ID已經正確設置了,所有東西都在傳遞 - 感謝您的幫助。 – Mark

+0

@Mark確保接受答案(答案分數附近的複選標記),如果解決了問題。 –