2014-09-11 2 views
4

Я использую authlogic для моей аутентификации пользователя, а в моем ApplicationController у меня есть «current_user», «current_user_session» и т. Д., Определенные и заданные как helper_methods.Сбой с помощью verify_partial_doubles с rails 4 и rspec 3

У меня есть очень простой вид спецификации для моего основного индекса:

RSpec.describe "main/index.html.erb", :type => :view do 
    context "when not logged in" do 

    before do 
     allow(view).to receive(:current_user).and_return(nil) 
    end 

    it "has an h1" do 
     render 
     expect(rendered).to include('h1') 
    end 

    end 
end 

Проблема заключается в том, что если «mocks.verify_partial_doubles = True» в моей конфигурации, то это приводит к впечатляюще массивную ошибку, как она сбрасывает целую объект, а затем говорит, что в нижней части:

1) main/index.html.erb when not logged in has an h1 
    Failure/Error: allow(view).to receive(:current_user).and_return(nil) 
     #<#<Class:0x00000104c249d0>:......... 
     @rendered_views={}>> does not implement: current_user 

конечно, рекомендуется verify_partial_doubles устанавливается истина, но при этом эти перерывы. Я вытащил эту прямо из документации:

https://www.relishapp.com/rspec/rspec-rails/v/3-1/docs/view-specs/view-spec#passing-view-spec-that-stubs-a-helper-method

Если метод появляется в ApplicationHelper он будет работать. Но если это в ApplicationController и определяется как helper_method нет такой удачи:

helper_method :current_user, ... 

def current_user 
    return @current_user if defined?(@current_user) 
    @current_user = current_user_session && current_user_session.record 
end 

Я хочу защиту, которая обеспечивает verify_partial_doubles, как я могу обойти эту проблему?

ответ

3

Это известная проблема, и единственный способ заставить ее работать - извлечь методы в модуль и включить их в свои помощники и контроллер.

Дополнительная информация: https://github.com/rspec/rspec-rails/issues/1076

+0

Спасибо за ответ. –

+0

Блестящий. Это было очень полезно. Спасибо – GhostRider

0

Вы можете отключить двойную проверку для представлений следующим образом:

RSpec.configure do |config| 
    config.before(:each, type: :view) do 
    config.mock_with :rspec do |mocks| 
     mocks.verify_partial_doubles = false 
    end 
    end 

    config.after(:each, type: :view) do 
    config.mock_with :rspec do |mocks| 
     mocks.verify_partial_doubles = true 
    end 
    end 
end 

Таким образом, вы будете в состоянии держать гася методы просмотра с:

allow(view).to receive(:current_user).and_return(nil) 

Дополнительная информация: https://github.com/rspec/rspec-rails/issues/1076

+0

Да, спасибо за это. Я просто чувствую, что это далеко не уродливо и, честно говоря, представляет собой серьезный провал в rspec. Весь метод «current_user as helper method in app controller» достаточно распространен, что не требуется много усилий для выполнения этой работы. –