使用RSpec测试布局

Don*_*ker 10 rspec ruby-on-rails rspec2 rspec-rails ruby-on-rails-3

在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 %>
Run Code Online (Sandbox Code Playgroud)

我想确保如果没有提供此消息将显示的入门详细信息以及是否已提供,则不要显示此消息.

Chr*_*erg 14

您可以像任何其他视图一样测试布局.只要创建一个文件application.html.erb_spec.rb(替换erbhaml在必要时)spec/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
Run Code Online (Sandbox Code Playgroud)

我使用我的一个应用程序执行此操作并没有问题,因此我不明白为什么它也不适合您的情况.