【发布时间】:2017-06-07 02:07:11
【问题描述】:
我正在测试一种用于创建新订单的控制器方法(类似电子商务的应用程序)。如果用户在系统中,他应该被重定向到new_user_session_path,否则到new_order_path。就这么简单。
这是我的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 方法,因为它计算给定参数的总价格。但在我的测试中,我只想确保重定向是正确的。
现在我遇到了类似的错误(它们来自 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
当然,我可以提供所有参数,但它们的数量非常多,此外,我只想测试正确的重定向。据我所知,在这种情况下,当您想显式测试方法时,mock 和 subs 很有用。但就我而言,我想 - 不知何故 - 省略它们。我怎样才能确保这种行为?
【问题讨论】:
标签: ruby-on-rails ruby rspec mocking stub