关于从rails视图中存根辅助方法的提示

时间:2014-09-30 14:55:23

标签: ruby-on-rails rspec capybara

我有一个独特的场景。我正在使用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对象,因为这不是视图规范。我希望这很容易。如果有一种方法可以隐式定义视图对象,那将是非常棒的。

我已就此主题进行了广泛搜索,也许共识是使用黄瓜并手动登录用户。或者在视图中运行此规范。如果有关于如何在视图中运行辅助方法并测试它的任何提示。我将不胜感激。

0 个答案:

没有答案