我正在使用authlogic进行用户身份验证,而在我的ApplicationController中,我将“current_user”,“current_user_session”等定义并设置为helper_methods。
我的主索引有一个非常简单的视图规范:
RSpec.describe "main/index.html.erb", :type => :view do
context "when not logged in" do
before do
allow(view).to receive(:current_user).and_return(nil)
end
it "has an h1" do
render
expect(rendered).to include('h1')
end
end
end
问题是如果在我的配置中“mocks.verify_partial_doubles = true”,那么这会导致一个令人印象深刻的大错误,因为它会转储整个对象然后在底部说:
1) main/index.html.erb when not logged in has an h1
Failure/Error: allow(view).to receive(:current_user).and_return(nil)
#<#<Class:0x00000104c249d0>:.........
@rendered_views={}>> does not implement: current_user
当然,建议将verify_partial_doubles设置为true,但这样做会中断。我从文档中直接提到了这一点:
如果方法出现在ApplicationHelper中,它将起作用。但如果它在ApplicationController中并被定义为helper_method则没有这样的运气:
helper_method :current_user, ...
def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.record
end
我想要verify_partial_doubles提供的保护,我该如何解决这个问题?
答案 0 :(得分:3)
这是一个已知问题,让它运行的唯一方法是将方法提取到模块中并将其包含在视图助手和控制器中。
答案 1 :(得分:0)
您可以按如下方式停用视图的双重验证:
RSpec.configure do |config|
config.before(:each, type: :view) do
config.mock_with :rspec do |mocks|
mocks.verify_partial_doubles = false
end
end
config.after(:each, type: :view) do
config.mock_with :rspec do |mocks|
mocks.verify_partial_doubles = true
end
end
end
通过这种方式,您可以使用以下方法保持视图方法:
allow(view).to receive(:current_user).and_return(nil)