问题描述
假设我设置了一个具有索引操作的HomeController
class HomeController< ApplicationController
def index
@users = User.all
end
end
b $ b
并通过根路径路由到它。
root:to => home#index
为什么此请求规范失败
it应该调用home#index动作do
HomeController.should_receive(:index)
访问root_path
end
失败/错误:HomeController.should_receive(:index)
(< HomeController(class)>)。index(any args)
expected:1 time
received:0 times
?是因为索引方法被调用为一个实例方法而不是类方法?
你想测试,我认为有什么方法可以在哪里使用的一些混乱,所以我会尝试和举例,,和(例如访问
,具体取决于您的Rails / RSpec版本):
spec / features / home_features_spec.rb >
特性索引页do
方案查看索引页do
访问root_path
expect (page).to have_text(Welcome to my awesome index page!)
end
end
Given I set up a HomeController with an index action
class HomeController < ApplicationController
def index
@users = User.all
end
end
and routed to it via the root path,
root :to => "home#index"
why does this request spec fail
it 'should called the home#index action' do
HomeController.should_receive(:index)
visit root_path
end
with the following message
Failure/Error: HomeController.should_receive(:index)
(<HomeController (class)>).index(any args)
expected: 1 time
received: 0 times
? Is it because the index method is called as a instance method instead of a class method?
I'm not sure exactly what you want to test, and I think there's some confusion as to what methods can be used where, so I'll try and give examples of Routing specs, Request Specs, Controller specs, and Feature specs, and hopefully one of them will be appropriate for you.
Routing
If you want to make sure that your root path gets routed to the home#index
action, a routing spec may be appropriate:
spec/routing/routing_spec.rb
describe "Routing" do
it "routes / to home#index" do
expect(get("/")).to route_to("home#index")
end
end
Request
If you want to make sure that the index
template gets rendered on a request to your root path, a request spec may be appropriate:
spec/requests/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
Controller
If you want to make sure that the index
template gets rendered on a request to the index
action of your HomeController
, a controller spec may be appropriate (and quite similar to a request spec in this case, but focused exclusively on the controller):
spec/controllers/home_controller_spec.rb
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
Feature
If you want to make sure the page rendered by home#index
has some specific content, a feature spec may be appropriate (and also the only place you can use Capybara methods like visit
, depending on your Rails/RSpec version):
spec/features/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
这篇关于Rspec / Capybara:测试是否调用了控制器方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!