2013-04-16 1 views
1

Я обновляю рельсы 2 приложения к рельсам 3 & не знает, как «обновить» следующую строку из одного из моих тестовКак преобразовать Rails 2/RSpec в синтаксис Rails 3/RSpec 2?

Category.should_receive(:find).with(:all,:conditions => {:parent_id => @parent_id}, :order => 'disp_order DESC').and_return(@categories_collection) 

Надеясь кто-то может предоставить некоторые указатели на это, как я не уверен на 100% где начать здесь.

я получаю следующее сообщение об ошибке, когда я запускаю это:

Failure/Error: Category.should_receive(:find).with(:all, 
     (<Category(id: integer, permalink: string, name: string, parent_id: integer) (class)>).find(:all, {:conditions=>{:parent_id=>1}, :order=>"display_order DESC"}) 

* * Update 1

Я вижу что-то действительно странное сейчас, я рефакторинга, как Джим объяснена (большое объяснение КСТАТИ!), но теперь получаю следующее:

Failure/Error: Category.should_receive(:with_parent).with(1).and_return(@sub_category) 
     (<Category(id: integer, permalink: string, name: string, parent_id: integer) (class)>).with_parent(1) 
      expected: 1 time 
      received: 0 times 

Однако, если добавить следующее моего теста:

puts Category.with_parent(1).length.to_s 

Выход «1» - правильное/ожидаемое значение. По какой-то причине RSpec не видит ошибку &. Вы знаете, почему это может произойти?

* * Update 2

Хорошо, что интересно, если я использую следующий мой тест пройден:

Category.with_parent(@parent_id).should == [@sub_category] 

пока это не удается:

Category.should_receive(:with_parent).with(@parent_id).and_return(@sub_category) 

Есть ли проблема с использованием should_receive & .ad_return в этом контексте в rspec2?

+0

Вы получаете ошибку? –

ответ

1

От линии от теста, похоже, код под теста:

Category.find(:all, :conditions => {:parent_id => @parent_id}, :order => 'disp_order DESC') 

Этот синтаксис был устаревшим в Rails 3 в пользу змеевидных AREL вызовов, так же функция искателя теперь будет написано as:

Category.where(:parent_id => @parent_id).order('disp_order DESC') 

Возможно, вы можете сказать, что издевательство над этим будет сложнее из-за цепочки методов. Поэтому лучшим советом является рефакторинг искателя в метод (возможно, с использованием области) в классе категории, который можно изолировать и высмеивать более легко.

Например:

class Category << ActiveRecord::Base 

    scope :with_parent_id, lambda { |parent_id| where(:parent_id => parent_id).order('disp_order DESC') } 

end 

Затем вы можете дразнить искатель вызова, как это:

Category.should_receive(:with_parent_id).with(@parent_id).and_return(@categories_collection) 
+0

Благодарим за это, добавленный ответ OP – Jason