Rspec / Capybara:测试是否调用控制器方法

时间:2013-06-08 22:55:15

标签: ruby-on-rails rspec controller capybara

鉴于我设置了一个带有索引动作的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

?是因为索引方法被调用为实例方法而不是类方法吗?

2 个答案:

答案 0 :(得分:21)

我不确定你想要测试什么,我认为在哪里可以使用哪些方法存在一些混淆,所以我会尝试举例Routing specsRequest SpecsController specsFeature 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