Я тестирую метод контроллера для создания новых заказов (приложение для электронной коммерции). Если пользователь присутствует в системе, он должен быть перенаправлен на 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
Из Конечно, я мог бы предоставить все параметры, но их довольно много, и, кроме того, я просто хочу проверить правильность перенаправления. Насколько мне известно, в этом случае полезны издевательства и подтипы, когда вы хотите явно протестировать методы. Но в моем случае я хочу - как-то - опустить их. Как я могу обеспечить такое поведение?
Спасибо! Я пытался использовать разные синтаксисы, например. 'Menu.any_instance.stub (: date) .and_return (" ")', но ваш работает как шарм! – mohnstrudel
Для великого правосудия 'allow_any_instance_of' - не лучшее решение. Это просто облегченный вариант. Чтобы сделать вещи более классными, создайте экземпляр «Menu», сделайте запрос, используя его идентификатор, как 'params ['menu_id']' (у вас он уже есть). А затем запустите метод 'calculate_price', который вызывается не в каком-либо экземпляре' Menu', а в вашем экземпляре 'Menu'. Это может сделать для вас немного больше неприятностей, но в любом случае это будет лучший вариант. – VAD