使用RSpec测试布局

10
什么是在Rails 3布局中测试逻辑的最佳方法?
例如:当用户登录我的网站时,如果他们没有完成入门流程,我会在所有页面顶部显示警报。 这个逻辑被放置在应用程序布局中。 我只是检查特定键的已登录用户。 如果该键不存在,则显示警报。 只要键存在(表示他们已经完成了入门流程),我就不显示警报。
目前,我正在尝试使用视图测试来实现此目的,但是通过包括应用程序布局,我遇到了各种`ActionView :: Template :: Error:undefined method'authenticate' for 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 %>

我希望确保如果他们没有提供入职详细信息,那么将显示此消息,如果已经提供了,则不显示此消息。

2个回答

14

您可以像测试其他视图一样测试布局。只需在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? 方法调用引起的。您可以通过在测试中模拟 user_signed_in? 方法并像 @shioyama 在代码中展示的那样返回来处理此问题。
下面的代码演示了如何模拟 user_signed_in? 方法,并返回 true,如果您想要在视图中执行 if 语句,或者返回 false,如果您不想要执行。 view.stub(:user_signed_in?).and_return(true)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接