4

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

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

4

2 回答 2

23

我不确定你到底想测试什么,而且我认为在哪里可以使用哪些方法存在一些混淆,所以我将尝试举例说明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请求上呈现,控制器规范可能是合适的(在这种情况下与请求规范非常相似,但只关注控制器):indexHomeController

规格/控制器/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

特征

如果您想确保所呈现的页面home#index具有某些特定内容,则功能规范可能是合适的(也是您可以使用Capybara 方法的唯一地方,例如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
于 2013-06-09T14:53:40.623 回答
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
于 2015-08-12T15:13:22.180 回答