鉴于我设置了一个带有索引动作的HomeController
class HomeController < ApplicationController
def index
@users = User.all
end
end
并通过根路径
路由到它 root :to => "home#index"
为什么此请求规范失败
it 'should called the home#index action' do
HomeController.should_receive(:index)
visit root_path
end
带有以下消息
Failure/Error: HomeController.should_receive(:index)
(<HomeController (class)>).index(any args)
expected: 1 time
received: 0 times
?是因为索引方法被调用为实例方法而不是类方法吗?
答案 0 :(得分:21)
我不确定你想要测试什么,我认为在哪里可以使用哪些方法存在一些混淆,所以我会尝试举例Routing specs,Request Specs ,Controller specs和Feature specs,希望其中一个适合您。
如果您想确保将根路径路由到home#index
操作,则路由规范可能是合适的:
<强>规格/路由/ routing_spec.rb 强>
describe "Routing" do
it "routes / to home#index" do
expect(get("/")).to route_to("home#index")
end
end
如果要确保在对根路径的请求中呈现index
模板,请求规范可能是合适的:
<强>规格/请求/ home_requests_spec.rb 强>
describe "Home requests" do
it 'successfully renders the index template on GET /' do
get "/"
expect(response).to be_successful
expect(response).to render_template(:index)
end
end
如果您希望确保index
模板在index
的{{1}}操作请求时呈现,则控制器规范可能是合适的(并且非常类似于在这种情况下请求规范,但专注于控制器):
<强>规格/控制器/ home_controller_spec.rb 强>
HomeController
如果您想确保describe HomeController do
describe "GET index" do
it "successfully renders the index template" do
expect(controller).to receive(:index) # this line probably of dubious value
get :index
expect(response).to be_successful
expect(response).to render_template(:index)
end
end
end
呈现的网页包含某些特定内容,则可能适合使用功能规范(也是唯一可以使用home#index
visit
的地方,取决于您的Rails / RSpec版本):
<强>规格/特征/ home_features_spec.rb 强>
feature "Index page" do
scenario "viewing the index page" do
visit root_path
expect(page).to have_text("Welcome to my awesome index page!")
end
end
答案 1 :(得分:3)
class MyController < ApplicationController
def index
my_method
end
def my_method
end
end
describe MyController do
it 'calls my method' do
expect(controller).to receive(:my_method)
get :index
end
end