2015-09-17 2 views
3

я написал следующее RSpec тест особенность спецификации:Использование Завещание в RSpec тесты функции

require "rails_helper" 

RSpec.describe "Team management", type: :feature do 
    user_sign_in 

    describe "User creates a new team" do 
    ...  
    expect(page).to have_link("#{team_name}") 
    end 
end 

Метод user_sign_in определяется в моем rails_helper.rb:

ENV['RAILS_ENV'] ||= 'test' 
require 'spec_helper' 
require File.expand_path('../../config/environment', __FILE__) 
require 'rspec/rails' 
require 'capybara/rails' 

... 

module UserSignInHelpers 
    def user_sign_in 
    before(:each) do 
     @request.env['devise.mapping'] = Devise.mappings[:user] 

     @current_user = FactoryGirl.create(:user) 
     @current_user.confirm 

     sign_in :user, @current_user 
    end 
    end 
end 

RSpec.configure do |config| 
    ... 
    # The different available types are documented in the features, such as in 
    # https://relishapp.com/rspec/rspec-rails/docs 
    config.infer_spec_type_from_file_location! 

    config.extend UserSignInHelpers, type: :controller 
    config.extend UserSignInHelpers, type: :feature 
    config.include Devise::TestHelpers, type: :controller 
    config.include Devise::TestHelpers, type: :feature 
end 

Метод user_sign_in работает от всех мои контрольные спецификации, но когда я запускаю свою спецификацию спецификации, она не работает:

Team management 
    User creates a new team 
    example at ./spec/features/user_creates_a_new_team_spec.rb:19 (FAILED - 1) 

Failures: 

    1) Team management User creates a new team 
    Failure/Error: Unable to find matching line from backtrace 
    NoMethodError: 
     undefined method `env' for nil:NilClass 
    # /Users/xxxx/.rvm/gems/ruby-2.2.1/gems/devise-3.5.1/lib/devise/test_helpers.rb:24:in `setup_controller_for_warden' 

Я не понимаю, почему это работает в тестах контроллера, а не в тесте. Есть ли что-то, что я могу сделать, чтобы эта работа проходила в функциональных тестах?

ответ

2

Существует основная проблема с тем, что вы пытаетесь сделать. (Devise работы на вершине Warden) Warden является Rack промежуточного слоя, но RSpec контроллера спецификации даже не включает в себя Rack, как эти типах спецификации не предназначены для запуска вашего полного приложения стеков, но только ваш кода контроллера.

Ref

Test with Capybara

У меня есть простой помощник поддержки, что позволяет мне войти и пользователи выхода из системы:

module Auth 
    def create_user! 
    @user = User.create(email: '[email protected]', password: '11111111') 
    end 

    def sign_in_user! 
    setup_devise_mapping! 
    sign_in @user 
    end 

    def sign_out_user! 
    setup_devise_mapping! 
    sign_out @user 
    end 

    def setup_devise_mapping! 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    end 

    def login_with_warden! 
    login_as(@user, scope: :user) 
    end 

    def logout_with_warden! 
    logout(:user) 
    end 

    def login_and_logout_with_devise 
    sign_in_user! 
    yield 
    sign_out_user! 
    end 

    def login_and_logout_with_warden 
    Warden.test_mode! 
    login_with_warden! 
    yield 
    logout_with_warden! 
    Warden.test_reset! 
    end 
end 

в особенности:

RSpec.describe "Team management", type: :feature do 
    describe "User creates a new team" do 
    login_and_logout_with_warden do 
     # tests goes here 
    end 
    end 
end 

в контроллере:

RSpec.describe "Team management", type: :controller do 
    describe "User creates a new team" do 
    login_and_logout_with_devise do 
     # tests goes here 
    end 
    end 
end 
+0

Вы помещаете Auth в spec/support/auth.rb? Если да, то как я могу включить его, чтобы он был доступен для моего контроллера и спецификаций auth? Я добавил 'config.extend Auth, type:: controller' и' config.extend Auth, type:: feature' to 'rails_helper.rb'. Вот что происходит, когда я пытаюсь запустить тест с использованием Auth: https://goo.gl/Ce7a3d – RobertJoseph

+0

Я думаю, вы должны использовать 'include' вместо' extend', это разные вещи 'include' и' extend'. –

+0

Если я хочу получить доступ к переменной @user в моих спецификациях, я должен использовать 'include'? – RobertJoseph

Смежные вопросы