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)
请注意,我还没有写完测试,所以请省略任何评论:干燥代码等。
感谢您的帮助家伙/女孩!:)
它失败的原因是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可能会引入其他问题。