2017-01-22 36 views
3

Я тестирую метод контроллера для создания новых заказов (приложение для электронной коммерции). Если пользователь присутствует в системе, он должен быть перенаправлен на new_user_session_path, иначе на new_order_path. Просто как тот.Rspec запретить метод от вызова

Это мой orders_controller.rb

def new 
     if !User.where(phone: params[:phone]).blank? && !user_signed_in? 

      redirect_to new_user_session_path() 
      flash[:info] = "Already present" 
     else 
      @order = Order.new 
      @menu = Menu.find(params[:menu_id]) 
      @menu_price = @menu.calculate_price(@menu, params) 
     end 
    end 

В моем приложении, мне нужен метод calculate_price называться, потому что она вычисляет общую цену учитывая PARAMS. Но в моем тесте я просто хочу убедиться, что перенаправление правильное.

Сейчас я получаю сообщение об ошибке, как (они поставляются в файле Menu.rb, так как calculate_price называется):

Front::OrdersController#new redirects user to new order page if user is not present in the system 
    Failure/Error: menu_price_change = menu_amount.split(",")[1].gsub(" ","").gsub("]",'') 

    NoMethodError: 
     undefined method `split' for nil:NilClass 

Это мой спецификации файла:

require 'rails_helper' 


describe Front::OrdersController, type: :controller do 
    describe '#new' do 
     # Set up dummy menu 
     let (:menu) { Menu.create() } 

     it "redirects user to sign up page if user is present in the system" do 
      user = User.create(name: "Bob", password: "bobspassword", phone: "+7 (903) 227-8874") 

      get :new, params: { phone: user.phone } 
      expect(response).to redirect_to(new_user_session_path(phone: user.phone)) 
     end 

     it "redirects user to new order page if user is not present in the system" do 
      non_present_phone = "+7 (903) 227-8874"  
      get :new, params: { phone: non_present_phone, menu_id: menu.id} 
      expect(response).to redirect_to(new_order_path) 
     end 

    end 
end 

Из Конечно, я мог бы предоставить все параметры, но их довольно много, и, кроме того, я просто хочу проверить правильность перенаправления. Насколько мне известно, в этом случае полезны издевательства и подтипы, когда вы хотите явно протестировать методы. Но в моем случае я хочу - как-то - опустить их. Как я могу обеспечить такое поведение?

ответ

3

Вы хотите просто проверить перенаправления и ошибки, возникающие при запуске метода calculate_price. Почему бы вам просто не заглушить этот метод? Ваш файл спецификации может быть таким:

require 'rails_helper' 


describe Front::OrdersController, type: :controller do 
    describe '#new' do 
     # Set up dummy menu 
     let (:menu) { Menu.create() } 

     # Check this out 
     before do 
      allow_any_instance_of(Menu).to receive(:calculate_price) 
      # or if you need certain value 
      allow_any_instance_of(Menu).to receive(:calculate_price).and_return(your_value) 
     end 

     it "redirects user to sign up page if user is present in the system" do 
      user = User.create(name: "Bob", password: "bobspassword", phone: "+7 (903) 227-8874") 

      get :new, params: { phone: user.phone } 
      expect(response).to redirect_to(new_user_session_path(phone: user.phone)) 
     end 

     it "redirects user to new order page if user is not present in the system" do 
      non_present_phone = "+7 (903) 227-8874"  
      get :new, params: { phone: non_present_phone, menu_id: menu.id} 
      expect(response).to redirect_to(new_order_path) 
     end 

    end 
end 
+0

Спасибо! Я пытался использовать разные синтаксисы, например. 'Menu.any_instance.stub (: date) .and_return (" ")', но ваш работает как шарм! – mohnstrudel

+0

Для великого правосудия 'allow_any_instance_of' - не лучшее решение. Это просто облегченный вариант. Чтобы сделать вещи более классными, создайте экземпляр «Menu», сделайте запрос, используя его идентификатор, как 'params ['menu_id']' (у вас он уже есть). А затем запустите метод 'calculate_price', который вызывается не в каком-либо экземпляре' Menu', а в вашем экземпляре 'Menu'. Это может сделать для вас немного больше неприятностей, но в любом случае это будет лучший вариант. – VAD