【问题标题】:Using RSpec to test a layout使用 RSpec 测试布局
【发布时间】:2012-11-10 14:48:22
【问题描述】:

在 rails 3 布局中测试逻辑的最佳方法是什么?

示例:当用户登录我的网站时,如果他们尚未完成入职流程,我会在所有页面的屏幕顶部向他们显示警报。这个逻辑被放置在应用程序布局中。我只是检查登录用户的特定密钥。如果密钥不存在,我会显示警报。一旦密钥出现(意味着他们已经完成了入职),我就不会显示警报。

目前我正在尝试通过视图测试来执行此操作,但是通过包含应用程序布局,我得到了各种 ActionView::Template::Error: undefined methodauthenticate' 的 nil:NilClass` 错误,而且我似乎无法测试此功能。

我需要确保我有这个正在测试,因为如果由于某种原因我的一个开发人员意外破坏了这个功能(显示的视图不完整),我们需要在构建时立即知道。

我试图在我的布局中测试的代码如下所示:

<% if user_signed_in? %>
    <% unless current_user.has_completed_onboarding? %>
      <div class="alert">
        You cannot accept payments from your clients until you set up your payment gateway.
        <%= link_to "Set up your", payment_gateway_path %> payment gateway. Its quick, we promise. :)
      </div>
    <% end %>
<% end %>

我想确保如果未提供他们的入职详细信息,则会显示此消息,如果已提供,则不要显示此消息。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rspec rspec2 rspec-rails


    【解决方案1】:

    您可以像测试任何其他视图一样测试您的布局。只需在spec/views/layouts/ 中创建一个文件application.html.erb_spec.rb(如有必要,将erb 替换为haml),然后在该文件中像往常一样写下您的规格,例如:

    require 'spec_helper'
    
    describe 'layouts/application' do
    
      context 'signed-in user' do
    
        before { view.stub(:user_signed_in?) { true } }
    
        context 'completed onboarding' do
    
          before do
            user = double('user')
            user.stub(:has_completed_onboarding?) { false }
            assign(:current_user, user)
          end
    
          it "should display alert" do
            render
            rendered.should have_selector('.alert')
          end
    
        end
    
        ...
    
      end
    
      context 'signed-out user' do
        ...
      end
    
      ...
    
    end
    

    我使用我的一个应用程序执行此操作,它没有问题,所以我不明白为什么它也不适用于您的情况。

    【讨论】:

      【解决方案2】:

      你得到的错误ActionView::Template::Error: undefined method authenticate for nil:NilClass是视图中的user_signed_in?方法调用引起的。正如@shioyama 在代码中显示的那样,您可以通过在测试中对user_signed_in? 方法存根来处理这个问题。

      以下代码显示了如何存根 user_signed_in? 方法,如果您希望在视图中执行 if 语句,则返回 true,如果不希望执行,则返回 false。 view.stub(:user_signed_in?).and_return(true)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-11
        • 1970-01-01
        • 2011-05-09
        • 2014-12-25
        • 2014-08-16
        • 2017-06-28
        • 2011-12-22
        • 1970-01-01
        相关资源
        最近更新 更多