我有一个独特的场景。我正在使用Rspec 3和Capybara来运行一些rspec测试,我需要根据某些测试将方法调用存根以返回true / false。
我的测试是在spec / features / landing_page_spec.rb
中我有一个测试:
describe "a logged in user with a pending application" do
before do
allow_any_instance_of(UserApplicationInfo).to receive(:has_pending_application?).and_return(true)
allow(ApplicationController).to receive(:logged_in?).and_return(true)
visit '/'
end
我在app / controllers / helpers / logins_helper.rb
中有一个帮助方法module LoginsHelper
def logged_in?
current_user.present?
end
end
我有一个视图/ landing_page / index.html.erb,其中包含以下代码段
<% if logged_in? && @user.account_id %>
I want this
<% else %>
I dont want this
<% end %>
我无法删除辅助方法logged_in?
。我在控制器中时能够存根方法。例如,当我在landing_page_controller中放置pry
时,我得到以下内容:
[1] pry(#<LandingPageController>)> logged_in?
=> true
[4] pry(#<LandingPageController>)> self.class
=> LandingPageController
[1] pry(#<LandingPageController>)> self.class.superclass
=> ApplicationController
当我在视图中设置pry
/ landing_page / index.html.erb
[1] pry(#<#<Class:0x74ad8>>)> logged_in?
=> false
[3] pry(#<#<Class:0x74ad8>>)> self.class
=> #<Class:0x74ad8>
[4] pry(#<#<Class:0x74ad8>>)> self.class.superclass
=> ActionView::Base
现在我明白了login_in的原因?在控制器中返回true是因为它继承自ApplicationController。它似乎不像ActionView :: base那样。但我尝试过以下代码:
allow_any_instance_of(ApplicationController).to receive(:logged_in?).and_return(true)
allow_any_instance_of(ActionView::Base).to receive(:logged_in?).and_return(true)
但没有运气。我还阅读了stubbing a helper method,但我无法访问view
对象,因为这不是视图规范。我希望这很容易。如果有一种方法可以隐式定义视图对象,那将是非常棒的。
我已就此主题进行了广泛搜索,也许共识是使用黄瓜并手动登录用户。或者在视图中运行此规范。如果有关于如何在视图中运行辅助方法并测试它的任何提示。我将不胜感激。