2011-01-25 58 views
2

我的Rails 3應用程序有一個產品資源。「模擬#to_hash應該返回哈希」

在我的ProductsController規格,生成測試確保我重定向到一個產品網址AFER更新它。

下面的代碼錯誤:

#inside ProductsController spec 
def mock_product(stubs={}) 
    (@mock_product ||= mock_model(Product).as_null_object).tap do |product| 
    product.stub(stubs) unless stubs.empty? 
    end 
end 

it "should do something" do 
    product_url(mock_product) 
end 

錯誤是:

TypeError: RSpec::Mocks::Mock#to_hash should return Hash 

回答

0

我mock_model定義as_null_object(這意味着它將所有消息進行響應,除了那些存根,通過返回本身

因此,rails路由助手(如product_url(product))首先將產品轉換爲哈希,並使用產品['id']生成路由。

由於我mock_product沒有存根to_hash的 「as_null_object」 的行爲應優先

irb > mock_product 
=> #<Product:0x..fdb3b6176 @name="Product_1028"> 
irb > mock_product.to_hash 
=> #<Product:0x..fdb3b6176 @name="Product_1028"> 

我的解決辦法是存根to_hash:

irb > mock_product(:to_hash => {:id => 1 }).to_hash 
=> {:id=>1} 

如果這包括在mock_product模型通過默認?

+1

`mock_model`設置模型實例的`id`屬性(通常起始於「1001」),這應該是足夠的輔助功能,以產生路徑/ URL。它看起來像你的控制器的規格是相同的一個由RSpec的產生,這應該不提高`TypeError`工作。所以你的情況看起來很不尋常 - 你可以告訴別人什麼可以使用它嗎? – zetetic 2011-01-25 02:30:56