2015-06-19 58 views
2

我要共享幾對運行代碼和測試代碼。基本上,測試代碼只在對象類上使用find時有效,但問題是find是我不想使用的一種方法,因爲我不在尋找主鍵!Rspec不能存根或find_by_,只能找到

方法1:磕碰:wherePlan.all,使得第一可在它被稱爲

#run code 
@current_plan = Plan.where(stripe_subscription_id: event.data.object.lines.data.first.id).first 

#test code 
@plan = Plan.new #so this is the first Plan that I'd like to find 
Plan.stub(:where).and_return(Plan.all) 

#result of @current_plan (expecting @plan) 
=> nil 

方法2:鏈磕碰:where:first

#run code 
@current_plan = Plan.where(stripe_subscription_id: event.data.object.lines.data.first.id).first 

#test code 
@plan = Plan.new #so this is the first Plan that I'd like to find 
Plan.stub_chain(:where, :first).and_return(@plan) 

#result of @current_plan (expecting @plan) 
=> nil 

方法3:殘樁定製:find_by

#run code 
@current_plan = Plan.find_by_stripe_subscription_id(event.data.object.lines.data.first.id) 

#test code 
@plan = Plan.new 
Plan.stub(:find_by_stripe_subscription_id).and_return(@plan) 

#result of @current_plan (expecting @plan) 
=> nil 

方法4:磕碰:find WORKS!但我不能按主鍵找到......所以我非常需要的方式3工作...

#run code 
@current_plan = Plan.find(2) #for giggles, to make sure the stub is ignoring the 2 argument 

#test code 
@plan = Plan.new 
Plan.stub(:find).and_return(@plan) 

#result of @current_plan (expecting @plan) 
=> @plan 

我想另一個答案應該是我怎樣才能創造性地運用:find帶參數的,即使我明白這一點是不是最佳做法...

+0

如果沒有看到至少有一個說明問題的完整示例,很難看出發生了什麼。難道是設置「@ current_plan」的值的代碼永遠不會執行? – zetetic

+0

如果你認爲這會有所幫助,我很高興添加更多的代碼,但我使用方法4作爲基準來說,這種方法工作得很好,爲什麼不休息。從字面上來看,這些方法之間的區別在於我只是轉換代碼。讓我知道如果你想看到更多的代碼 – james

+0

你可能會嘗試添加一個期望,看看你正在存儲的方法實際上是被調用的。我看不出有什麼理由爲什麼你應該能夠存根:find但不是:find_by。 – zetetic

回答

0

好吧我有一個臨時解決方案,這只是使用選擇。即,

#run code 
@current_plan = Plan.select { |p| p.stripe_subscription_id == event.data.object.lines.data.first.id }.first 

#test code 
@plan = Plan.new 
Plan.stub_chain(:select, :first).and_return(@plan) 

#result of @current_plan (expecting @plan) 
=> @plan 

不過雖然...如果別人有想法,請附和......我現在,爲什麼wherewhere, first存根不工作有點學術好奇。

find_by_stripe_subscription_id,我做了一些更多的測試,甚至方法的期望都失敗了,自定義find_by方法,所以當然存根將不起作用。但是,請參閱下面的zetetic的答案,也許這只是我討厭的神...

0

你可以存根那些方法。所有這些測試都通過:

require 'rails_helper' 

RSpec.describe Foo, type: :model do 
    let(:foo) { double(name: "foo") } 

    it "works with find" do 
    expect(Foo).to receive(:find).and_return(foo) 
    expect(Foo.find(1)).to eq foo 
    end 

    it "works with find_by" do 
    expect(Foo).to receive(:find_by_name).and_return(foo) 
    expect(Foo.find_by_name("foo")).to eq foo 
    end 

    it "works with where" do 
    expect(Foo).to receive(:where).and_return([ foo ]) 
    expect(Foo.where(name: "foo")).to eq [foo] 
    end 
end 
+0

嗯...好的...所以我不知道該說些什麼。有些地方可能有些問題,但我真的不知道在哪裏和什麼地方。感謝這一點,雖然。 – james