预期:1 次接收任何参数:0 次接收任何参数

bit*_*zzy 7 rspec ruby-on-rails mocking

我正在测试index我的ProjectsController.

我正在使用 will_paginate gem,并且正在尝试编写一个 RSpec 测试,以确保在当前用户的项目projects_path 时调用 paginate 方法。

然而,我得到的结果不是我所期望的,我不知道为什么。

结果

Failure/Error: expect(user.projects).to receive(:paginate)
       (#<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Project:0x00000004719ef0>).paginate(any args)
           expected: 1 time with any arguments
           received: 0 times with any arguments
     # ./spec/requests/project_pages_spec.rb:82:in `block (3 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

项目#index

def index
    if params[:search]
      @projects = current_user.projects.search(params[:search]).paginate(:page => params[:page], :per_page => 13)
    else
      @projects = current_user.projects.paginate(:page => params[:page], :per_page => 13)
    end 
end 
Run Code Online (Sandbox Code Playgroud)

指标测试

describe "index" do

  describe "pagination" do

    let(:user) { FactoryGirl.create(:user) }
    let(:client) { FactoryGirl.create(:client) }

    before do
      capybara_sign_in(user)
      @project = Project.create(name: "Blog", fee: 550, client_id: client.id)
    end 

    it "should call the paginate method" do
      expect(user.projects).to receive(:paginate)
      visit projects_path
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

请注意,我还没有写完测试,所以请省略任何评论:干燥代码等。

感谢您的帮助家伙/女孩!:)

Phi*_*rom 6

它失败的原因是user您的规范文件与current_user您的控制器中的不同。因此,虽然current_user收到paginate您的规格user从来没有。有几种方法可以解决它。

你可以这样做:

expect_any_instance_of(User).to receive(:paginate)
Run Code Online (Sandbox Code Playgroud)

这里的缺点是您正在测试任何实例,而不是专门针对您的current_user实例。这是否是一个问题取决于你:)

另一种方法是存根current_user

controller.stub(:current_user).and_return(user)
expect(user.projects).to receive(:paginate)
Run Code Online (Sandbox Code Playgroud)

好处是您正在测试完全相同的用户。缺点是存根current_user可能会引入其他问题。