2011-01-25 5 views
2

Приложение My Rails 3 имеет ресурс продукта.«Mock # to_hash должен возвращать хэш»

В моих спецификациях ProductsController сгенерированные тесты проверяют, что я перенаправляю URL-адрес продукта, обновляя его.

следующие ошибки кода:

#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 (что означает, что он будет отвечать на все сообщения, за исключением тех, затушил, возвращая себя .

Итак, направляющие маршрутизации (например, product_url (продукт)) сначала преобразуют продукт в хэш и используют продукт ['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

+0

Я не уверен, почему это происходит. Но спасибо за проверку здравомыслия. – mkirk

+0

У меня такая же проблема и не нашел никакого решения = ( –

Смежные вопросы