10

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

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

目前我正在尝试通过视图测试来做到这一点,但是通过包含应用程序布局,我得到了各种ActionView::Template::Error: undefined method“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 %>

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

4

2 回答 2

14

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

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

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

于 2012-11-10T15:26:14.003 回答
2

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

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

于 2012-12-03T12:14:03.713 回答