2013-12-17 70 views
0

方法,我有一個叫做類上市和產品:你有存根在Rspec的紅寶石

class Listing 
    belongs_to :product 

    def item 
    @item ||= Product.find(product_id) 
    end 

    def url 
    "http://example.com/#{@item.pid}" 
    end 

end 


class Product 
    has_one :listing 
    attr_accessor :pid #returns an integer 
end 

在我的spec文件創建的列表對象與工廠女孩,併爲其分配一個產品。我在之前的規格和我每次打電話時測試了它:

@listing.item.id.should eq(@product.id) 

它會通過。

不過,我試着撥打:

@product = FactoryGirl.create(:product) 
@listing = FactoryGirl.create(:listing) 

@product.listing = @listing 
@listing.url.should eq("...") 

而且它不能呼籲上市類的URL方法......我怎麼能得到這個通過但仍使一個很好的測試?

+0

你得到的實際錯誤信息是什麼? (即當你說「它無法調用url方法時,你的意思是什麼」) –

+0

未定義的方法錯誤 – Davey

+0

啊,也許我還不夠清楚。你能否給我們提供錯誤和回溯的實際文字。 –

回答

2

在你Listing模型中,實例變量@item如果item方法被調用,它不會在您的測試只發生在被定義。因此,在調用url方法時,@item爲零,並且@item.pid由於發送pidnil而導致undefined method error

你可以,但是,更改url方法你@item.pid參考是簡單item.pid,你會沒事的,因爲這將調用item方法。

雖然這解釋了你所得到的錯誤,但我不能真正告訴你一個好的測試是什麼,因爲它不清楚你在應用程序中試圖完成什麼。

+0

在調用url方法時不會調用item方法嗎?並且|| =操作符應該設置項目的值,因爲它尚未設置。我基本上試圖用item方法緩存一個對象。它似乎沒有工作。 :( – Davey

+0

不,'item'方法不會在'url'方法體中調用,只會引用'@ item'實例變量,我會更新我的答案以表明您可以對這個特定問題做些什麼 –

+0

現在一切都很有意義,謝謝 – Davey

0

我很困惑,爲什麼在已經建立了belongs_to關聯時創建了item方法。

class Listing 
    belongs_to :product 

    def url 
    "http://example.com/#{product.pid}" 
    end 
end 

class Product 
    has_one :listing 
    attr_accessible :pid 
end 

# test setup 
# you can define the association in the factory 
FactoryGirl.define do 
    factory :listing do 
    association :product 
    end 

    factory :product do 
    pid 1234 
    end 
end 

# test 
listing = FactoryGirl.create(:listing) 
listing.url.should eq "http://example.com/1234"